Vale la pena mencionar aquí la Cocoa Memory Management Rules. Si trabaja en un entorno que no es de GC, p. iPhone, siempre vale la pena mencionarlos.
El estado regla fundamental:
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.
Es evidente que no obtuvieron obj con alloc, nuevo ... o algo que contiene la copia. Entonces no eres el propietario.
En su código, el segundo de los corolarios también es relevante:
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
He negrita la parte pertinente. Ha modificado la matriz desde la que recibió el objeto, por lo que podría desaparecer. O retiene el objeto antes de eliminarlo de la matriz o eliminarlo una vez que haya terminado con el objeto.
En realidad, usted puede ser que ser seguro, incluso con el código en tu pregunta porque la implementación de NSMutableArray de objectAtIndex de: podría hacer una retener seguido de un disparador automático en el artículo de vuelta. En un entorno multiproceso, esa sería la única forma de garantizar que el objeto siga siendo válido durante el tiempo suficiente como para devolverlo a la persona que llama. Sin embargo, no he visto el código para NSMutableArray, así que no confíe en él.
ETA: Sólo estado buscando en la guía de programación hilo y parece que NSMutableAtrray no retienen, autorelease.
Para hacer que la consecuencia de esto sea clara: Las clases NSArray y NSMutableArray tienen excepciones a la regla general de que los objetos devueltos de métodos cuyos nombres no contengan "nuevo", copiar "o" alloc "devuelven objetos liberados automáticamente. Esto significa que el código en la pregunta original no es seguro. – harms
@harms ¿esa regla no se aplica solo a la creación de objetos? – sylvanaar
@harms:. No hay una regla general de que los objetos devueltos de métodos cuyos nombres no contienen "nueva 'copia' o '' objetos autoreleased retorno alloc La única regla es que no es dueño de un objeto tal – JeremyP