2011-10-13 13 views
31

solía declarar todas las propiedades de los delegados comoforma recomendada para declarar propiedades de delegado con ARC

@property (assign) id<FooDelegate> delegate; 

que estaba bajo la impresión de que todo asignar propiedades deben ahora ser punteros débiles, es esto correcto? Si trato de declarar como:

@property (weak) id<FooDelegate> delegate; 

me sale un error al intentar @synthesize (propiedades débiles autogenerados no son compatibles).

¿Cuál es la mejor práctica en este caso?

+0

Esta es una buena pregunta y las respuestas no son muy concluyentes. Hubiera pensado usar weak pero los frameworks de Apple usan assign (ver UIPageViewController que solo está disponible en iOS5 +). –

Respuesta

22

Uso __unsafe_unretained lugar weak para proyectos dirigidos ARC IOS 4 y 5. La única diferencia es que weak Nils el puntero cuando se cancela la asignación, y que sólo ha apoyado en IOS 5.

Su otra pregunta se responde en Why are Objective-C delegates usually given the property assign instead of retain?.

+0

Sin embargo, lo estoy compilando para iOS 5, así que supongo que debería funcionar ...: -? – cfischer

+1

Eso es extraño, si su "Objetivo de implementación" es 5.0, debería funcionar solo con (débil). – Jano

23

Xcode 4 Refactor>Convertir a Objective-C ARC transforma:

@interface XYZ : NSObject 
{ 
    id delegate; 
} 
@property (assign) id delegate; 
... 
@synthesize delegate; 

en:

@interface XYZ : NSObject 
{ 
    id __unsafe_unretained delegate; 
} 
@property (unsafe_unretained) id delegate; 
... 
@synthesize delegate; 

Si no recuerdo mal también se menciona en la WWDC 2011 video sobre ARC .

+0

Volveré a ver el video. – cfischer

+1

¿Por qué no usar 'weak' en su lugar? –

+2

Esto era relevante * 2 * años atrás, cuando un SDK más joven de clang y iOS de la época poblaba la Tierra. – djromero

Cuestiones relacionadas