ti-enxame.com

O ivar 'título' existente para 'título' de propriedade insegura_ não retida deve ser __unsafe_unretained

Estou começando a me familiarizar com Objective-C 2.0

Quando tento construir o seguinte no Xcode, ele falha. O erro do compilador é o seguinte:

O ivar 'title' existente para 'title' de propriedade insegura_unretained deve 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

Alguém pode explicar onde errei?

32
bodacious

Presumo que você esteja usando o ARC.

No ARC, a qualificação de propriedade da propriedade deve corresponder à variável de instância (ivar). Portanto, por exemplo, se você disser que a propriedade é "forte", o ivar também deve ser forte.

No seu caso, você está dizendo que a propriedade é "assign", que é o mesmo que unsafe_unretained. Em outras palavras, essa propriedade não mantém nenhuma propriedade do NSString que você definiu. Ele apenas copia o ponteiro NSString *, e se o NSString for embora, ele irá embora e o ponteiro não será mais válido.

Então, se você fizer isso, o ivar também deve ser marcado como __unsafe_unretained para corresponder (se você espera que o compilador @synthesize a propriedade para você)

OU você pode simplesmente omitir a declaração ivar e deixar que o compilador faça isso para você também. Como isso:

@interface Movie : NSObject

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

@end

Espero que ajude.

53
Firoze Lafeer