Vale la pena menzionare il Cocoa Memory Management Rules qui. Se lavori in un ambiente non GC, ad es. iPhone, vale sempre la pena menzionarli.
La fondamentale regola di Stato:
You take ownership of an object if you create it using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy), or if you send it a retain message. You are responsible for relinquishing ownership of objects you own using release or autorelease. Any other time you receive an object, you must not release it.
Chiaramente non ha ottenuto obj con alloc, nuovo ... o qualcosa contenente copia. Quindi non lo possiedi.
Nel codice, il secondo dei corollari è anche rilevante:
A received object is normally guaranteed to remain valid within the method it was received in (exceptions include multithreaded applications and some Distributed Objects situations, although you must also take care if you modify an object from which you received another object). That method may also safely return the object to its invoker
ho grassetto la parte interessata. Hai modificato la matrice da cui hai ricevuto l'oggetto, quindi potrebbe andare via. O si conserva l'oggetto prima di rimuoverlo dall'array o si rimuove dopo aver terminato con l'oggetto.
In realtà, si potrebbe essere al sicuro anche con il codice nella tua domanda, perché l'implementazione di NSMutableArray di objectAtIndex: potrebbe fare un Retain seguito da un autorelease sulla voce di ritorno. In un ambiente multithread che sarebbe l'unico modo per garantire che l'oggetto rimanga valido per un tempo sufficiente a restituirlo al chiamante. Tuttavia, non ho visto il codice per NSMutableArray, quindi non fare affidamento su di esso.
ETA: Basta osservare la guida alla programmazione dei thread e sembra che NSMutableAtrray non mantenga, autorelease.
Per rendere la conseguenza di questa chiara:. Le classi NSArray e NSMutableArray hanno eccezioni alla regola generale che oggetti restituiti dai metodi i cui nomi non contengono "nuova, 'copia' o 'allocate' ritorno oggetti autoreleased Questo significa che il codice di nella domanda originale non è sicuro – harms
@harms questa regola non si applica solo alla creazione dell'oggetto? – sylvanaar
@harms: non esiste una regola generale per gli oggetti restituiti da metodi i cui nomi non contengono "nuovo", "copia" o "alloc" restituiscono oggetti autoreleased L'unica regola è che non possiedi un oggetto del genere – JeremyP