2011-07-31 11 views
87

Comencé a desarrollar mi primera aplicación iOS con Xcode 4.2, y me estaba orientando a iOS 5.0 con una plantilla de "aplicación de utilidad" (la que viene con un Controlador FlipsideView).¿Cómo reemplazo las referencias débiles cuando uso ARC y apunte a iOS 4.0?

He leído que, dado que ARC es una función en tiempo de compilación, también debería ser compatible con iOS 4, así que intenté orientar mi aplicación a 4.3 e intentar compilarla. Cuando lo hago, me sale este error:

FlipsideViewController.m: Error: Automático Número de recuento de referencia: El destino de implementación actual no admite referencias __weak automatizados

Se hace referencia a esta línea:

@synthesize delegate = _delegate; 

esa variable se declara como:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate; 

entiendo que "referencia débil s "no son compatibles con iOS 4, pero realmente no entiendo por qué querría usar una referencia débil para empezar, ni puedo imaginar cómo reescribiré las cosas para evitar su uso, mientras sigo aprovechando ARC (después de todo, se supone que funciona con iOS 4 y 5 ¿no?)

Respuesta

148

Para apuntar al sistema operativo anterior, puede usar unsafe_unretained en lugar de weak en su declaración de propiedad, y debería funcionar principalmente de la misma manera. weak se refieren a ellos mismos cuando su objetivo desaparece, pero unsafe_unretained deja abierta la posibilidad de que el objeto al que se está vinculando se convierta en un puntero colgante cuando se desasigna. El último es el mismo comportamiento que si hubiera usado assign como una declaración de propiedad en la gestión de memoria manual.

Hace esto para evitar ciclos de retención, que menciono en mi respuesta here. No desea tener un puntero fuerte a algo que pueda tener un puntero fuerte hacia el objeto original. Entonces nada se liberaría correctamente.

+0

Gracias por el asesoramiento. Usted dice "apuntar al sistema operativo anterior ...". ¿Esto significa que solo debo usar unsafe_unretained en compilaciones de la aplicación anterior a 5.0? ¿O puedo simplemente usar unsafe_unretained en mi código y compilarlo para apuntar tanto a 4.x como a 5.x? –

+1

@Mason - 'unsafe_unretained' es compatible con iOS 4.xy 5.0, por lo que te ofrece compatibilidad con versiones anteriores. Si estuviera construyendo solo 5.0, podría cambiar a 'weak' para aprovechar la seguridad adicional que le proporciona. –

+0

Intenté unsafe_unretained, funcionó de todos modos. Sin embargo, recibí muchas advertencias como '"** __NSAutoreleaseNoPool(): Objeto 0x564bd90 de la clase __NSArrayM liberado automáticamente sin ningún grupo en su lugar - solo goteando" * ", ¿eso es normal? – fifth

11

Si sólo con referencias débiles para seguridad adicional, llamada manualmente las nuevas funciones de tiempo de ejecución si están disponibles y reserva para asignación simple de las variables __unsafe_unretained si no.

ZWRCompatibility.h simplificará esto un poco.

+0

Muchas gracias @rpetrich! –

10

Gracias a la biblioteca de compatibilidad de Mike Ash PLWeakCompatibilty, ahora puede simplemente usar __weak en iOS 4.x también.

Es increíblemente fácil de configurar y no requiere consideración o esfuerzo adicional sobre 5.x.

Cuestiones relacionadas