2011-08-30 11 views
11

Estoy tratando de actualizar un objeto en NSMutableArrayobjetivo-c: cómo actualizar el objeto en NSMutableArray?

Product *message = (Product*)[notification object]; 
    Product *prod = nil; 


    for(int i = 0; i < ProductList.count; i++) 
    { 
     prod = [ProductList objectAtIndex:i]; 
     if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
     { 
      prod.Status = @"NotAvaiable"; 
      prod.Quantity = 0; 
      [ProductList removeObjectAtIndex:i]; 
      [ProductList insertObject:prod atIndex:i]; 
      break; 
     } 
    } 

Quiero saber que si hay alguna forma mejor de hacer esto?

Respuesta

35

líneas Retire

 [ProductList removeObjectAtIndex:i]; 
     [ProductList insertObject:prod atIndex:i]; 

y que va a estar bien!

+0

Sí - "pero ¿por qué"? –

+4

Hay porque [NSArray objectAtIndex: index] devuelve el puntero al objeto. – Nekto

+5

Usar objectAtIndex para recuperar un valor, modificarlo y luego usar replaceObjectAtIndex es mejor. – afollestad

20

Para la actualización, utilice

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject

Pero no es necesario en este caso, ya que está modificando el mismo objeto.

10

Puede comenzar utilizando fast enumeration, que es más rápido y fácil de leer. Además, no necesita quitar e insertar el objeto, solo puede editarlo en línea. De esta manera:

Product *message = (Product*)[notification object]; 

for(Product *prod in ProductList) 
{ 
    if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
    { 
     prod.Status = @"NotAvailable"; 
     prod.Quantity = 0; 
     break; 
    } 
} 

(Es ProductList un objeto Si es así, se debe comenzar con una letra minúscula:?. productList nombres en mayúsculas son para las clases también, Status y Quantity son propiedades y deben también comenzar con una minúscula. carta. le recomiendo que siga el Cocoa naming conventions.)

+3

+1 para las convenciones de nomenclatura –

5

Hay dos enfoques

  1. Crear un nuevo objeto y vuelva a colocar el objeto antiguo con el nuevo objeto
for(int i = 0; i < ProductList.count; i++)   
    { 
     prod = [ProductList objectAtIndex:i]; 
     if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
     { 
      newObj = [[Product alloc] autorelease]; 
      newObj.Status = @"NotAvaiable"; 
      newObj.Quantity = 0; 
      [ProductList replaceObjectAtIndex:i withObject:newObj]; 
      break; 
     } 

    } 

actualizar el objeto existente:

for(int i = 0; i < ProductList.count; i++) 
    { 
     prod = [ProductList objectAtIndex:i]; 
     if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
     { 
      prod.Status = @"NotAvaiable"; 
      prod.Quantity = 0; 
      break; 
     } 
    } 
4

Uso -insertObject:atIndex: o replaceObjectAtIndex:withObject:.

Cuestiones relacionadas