2011-12-03 15 views
31

sólo estoy llegar a enfrentarse con Objective-C 2.0Ivar existente 'título' de la propiedad unsafe_unretained 'título' debe __unsafe_unretained

Cuando intento para construir el siguiente en Xcode falla. El error del compilador es el siguiente:

El ivar 'título' existente para la propiedad no segura conservada 'título' debe ser __unsafe_unretained.

// main.m 
#import <Foundation/Foundation.h> 
#import "Movie.h" 
int main (int argc, const char * argv[]){ 
    Movie *movie = Movie.new; 

    NSLog(@"%@", movie); 

    return 0; 
} 

// movie.h 
#import <Foundation/Foundation.h> 

@interface Movie : NSObject{ 
    NSString *title; 
    int year; 
    int rating; 
} 

@property(assign) NSString *title; 
@property(assign) int rating; 
@property(assign) int year; 

@end 

#import "Movie.h" 

@implementation Movie; 

@synthesize title; // this seems to be issue - but I don't understand why? 
@synthesize rating; 
@synthesize year; 

@end 

¿Alguien puede explicar dónde he ido mal?

Respuesta

52

Supongo que está utilizando ARC.

En ARC, la calificación de propiedad de la propiedad debe coincidir con la variable de instancia (ivar). Entonces, por ejemplo, si dices que la propiedad es "fuerte", entonces el ivar también tiene que ser fuerte.

En su caso, usted dice que la propiedad es "assign", que es lo mismo que unsafe_unretained. En otras palabras, esta propiedad no mantiene ninguna propiedad de NSString que establezca. Simplemente copia el puntero NSString *, y si el NSString desaparece, desaparece y el puntero ya no es válido.

Así que si hacer eso, el Ivar también debe estar marcado para que coincida con __unsafe_unretained (si usted está esperando que el compilador @synthesize la propiedad para usted)

o simplemente puede omitir la declaración Ivar , y simplemente deja que el compilador haga eso por ti también. De esta manera:

@interface Movie : NSObject 

@property(assign) NSString *title; 
@property(assign) int rating; 
@property(assign) int year; 

@end 

Hope that helps.

+0

Gran explicación, ¡gracias! – bodacious

+0

Excelente explicación. Gracias! –

+1

Sí, solo necesita eliminar la declaración ivar del archivo .h en ARC. es decir, simplemente omita "{ NSString * title; int año; int rating; }" –