iphone - ¿Cómo reemplazo las referencias débiles cuando uso ARC y apunte a iOS 4.0?
automatic-ref-counting (3)
Comencé a desarrollar mi primera aplicación iOS con Xcode 4.2, y me estaba enfocando en iOS 5.0 con una plantilla de "aplicación de utilidad" (la que viene con un Controlador FlipsideView).
Leí 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, obtengo este error:
FlipsideViewController.m: error: recuento de referencia automático Problema: el objetivo de despliegue actual no es compatible con las referencias __weak automáticas
Está haciendo referencia a esta línea:
@synthesize delegate = _delegate;
Esa variable se declara como:
@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;
Entiendo que las "referencias débiles" 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 usarlas, mientras aún aprovechando ARC (después de todo, se supone que funciona con iOS 4 y 5 ¿verdad?)
Gracias a la biblioteca de compatibilidad de Mike Ash PLWeakCompatibilty , ahora también puedes 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.
Para apuntar al sistema operativo anterior, puede usar unsafe_unretained
lugar de weak
en su declaración de propiedad, y debería funcionar principalmente de la misma manera. weak
referencias weak
nulas cuando su objetivo desaparece, pero unsafe_unretained
hojas unsafe_unretained
abiertas abren la posibilidad de que el objeto al que se está enlazando se convierta en un puntero colgante cuando se desasigna. El último es el mismo comportamiento que si hubiera utilizado la assign
como declaración de propiedad en la administración manual de la memoria.
Haces esto para evitar los 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.
Si solo utiliza referencias débiles para seguridad adicional, llame manualmente a las nuevas funciones de tiempo de ejecución si están disponibles y vuelva a la asignación simple en __unsafe_unretained
variables si no es así.
ZWRCompatibility.h simplificará esto de alguna manera.