Utilizando el método NSObject -(id)awakeAfterUsingCoder:(NSCoder *)decoder
como un ejemplo, la documentación dice:¿Cuál es el nuevo patrón para liberarse con recuento automático de referencias?
permite que un objeto, después de ser decodificada, para sustituir otro objeto por sí mismo. Por ejemplo, un objeto que representa una fuente podría decodificarse, al , lanzarse y devolver un objeto existente que tenga la misma descripción de fuente que él mismo. De esta forma, los objetos redundantes pueden eliminarse .
Normalmente lo haría
[self release];
return substitutedObject;
Con ARC tiene que salir de esta línea de salida. ¿No se filtraría esto? ¿O debería confiar en el objeto NSCoder para liberar el objeto original por mí? Si es así, ¿por qué tendrías que liberarte explícitamente a ti mismo con código que no sea ARC en primer lugar?
No creo self = nil
es correcta a la luz de lo que la documentación del compilador dice sobre sí mismo: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.self
¿Puedes aclarar por qué tienes que retener explícitamente el resultado? Seguramente eso derrota el propósito de ARC. Gracias por responder a todo lo demás. – jamesmoschou
@moshy de nada. sí, al principio pasé por alto ese detalle. la razón es que 'awakeAfterUsingCoder:' devuelve una referencia no propietaria (o autorrellenada). como tal, ARC inserta una disminución de ref-count para nosotros para nuestro valor de retorno. lo que queremos hacer es efectivamente * transferir * la referencia de un objeto a otro. Lo ejecuté en instrumentos, sin fugas. no zombies sin la retención explícita, se enviaría un mensaje a un zombi. sin la versión explícita, una fuga. pruébalo tú mismo (coloca el bloque '@ autorelease' en un' while (1) '). – justin
¿Podría hacer que el método sea miembro de la familia 'init' con' __attribute __ ((objc_method_family (init))) 'y luego reasignar' self'? –