2011-08-30 13 views
11

Sto cercando di aggiornare un oggetto in NSMutableArrayogg-c: come aggiornare l'oggetto in 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; 
     } 
    } 

Voglio sapere che se c'è un modo migliore per fare questo?

risposta

35

linee Rimuovere

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

e che sarà ok!

+0

Sì - "ma perché"? –

+4

Esiste perché [NSArray objectAtIndex: index] restituisce il puntatore all'oggetto. – Nekto

+5

Utilizzare objectAtIndex per recuperare un valore, modificarlo e quindi usare replaceObjectAtIndex è meglio. – afollestad

20

Per l'aggiornamento, utilizzare

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

Ma non è necessario in questo caso, dal momento che si sta modificando lo stesso oggetto.

10

Si potrebbe iniziare usando fast enumeration, che è più veloce e più facile da leggere. Inoltre, non è necessario rimuovere e inserire l'oggetto, è sufficiente modificarlo in linea. Come questo:

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

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

ProductList un oggetto Se lo è, si dovrebbe iniziare con una lettera minuscola:?. productList nomi capitalizzati sono per le classi Inoltre, Status e Quantity sono proprietà e dovrebbero anche iniziare con una minuscola. lettera. consiglio vivamente di seguire il Cocoa naming conventions.)

+3

+1 per le convenzioni di denominazione –

5

ci sono due approcci

  1. Creare un nuovo oggetto e sostituire il vecchio oggetto con il nuovo oggetto
  2. 012.
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; 
     } 

    } 

Aggiornare l'oggetto esistente:

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

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

Problemi correlati