Mike Ash has written this introduction to ARC donde introduce algo como:¿Cuándo y por qué querría declarar una variable local como __weak usando ARC?
__weak Foo *_weakFoo = [object foo];
¿Por qué querría hacer eso por una variable local, temporal? __weak es una referencia de puesta a cero que establecerá el puntero _weakFoo automáticamente en cero tan pronto como el objeto al que se hace referencia se desasigna. Además, __weak sólo está disponible en iOS> = 5.
Cuando iba a tener problemas cuando hago simplemente esto ?:
Foo *_weakFoo = [object foo];
Esto siempre se espera que regrese un objeto o nula. Mi opinión es la siguiente:
Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456
Una cosa que todavía me molesta con arco es: ¿Cuándo se sabe que no necesito un objeto más? Argumentaría que cuando establezco un puntero a cero o a otra cosa, se da cuenta de que el objeto al que se hace referencia anteriormente ya no es necesario para este propietario y, por lo tanto, puede desaparecer. Pero el punto es: lo configuré en cero. ¡Así que es nada!
Entonces, cuándo tendría sentido buscar una variable local, y qué tipo de locura debo hacer en otro lugar para que realmente lo necesite?
¿Cómo podría haber un ciclo de retención? – openfrog
@openfrog - Este bloque en particular podría no tener el mayor riesgo de ser un ciclo de retención, pero uno con el que me he encontrado sería un observador basado en bloques para notificaciones (usando NSNotificationCenter '-addObserverForName: object: queue: usingBlock:') Si configura tal observador en un objeto, y se refiere a algo en 'self', configurará un ciclo cuando el objeto se aferra al bloque y el bloque se aferra al objeto. –
Después de escribir esto, me di cuenta de que este no es el mejor ejemplo porque dispatch_async() copia el bloque, pero solo hasta el final del método. Un mejor ejemplo habría sido el uso de NSBlockOperation ya que una instancia de este posee el bloque pasado en la vida del objeto, haciendo que los ciclos de retención sean más probables. –