unsafe_unretained属性'title'的现有ivar'title'必须__unsafe_unretained

时间:2011-12-03 13:59:48

标签: objective-c

我刚刚掌握了Objective-C 2.0

当我尝试在Xcode中构建以下内容时,它失败了。编译器的错误如下:

unsafe_unretained属性'title'的现有ivar'标题'必须为__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

有人可以解释我哪里出错吗?

1 个答案:

答案 0 :(得分:52)

我假设你正在使用ARC。

在ARC下,属性的所有权限定必须与实例变量(ivar)匹配。所以,例如,如果你说房产是“强大的”,那么伊娃也必须是强大的。

在您的情况下,您说该属性是“assign”,与unsafe_unretained相同。换句话说,此属性不保留您设置的NSString的任何所有权。它只是复制NSString *指针,如果NSString消失,它就会消失,指针不再有效。

因此,如果你这样做,那么必须将ivar 标记为__unsafe_unretained以匹配(如果你期望编译器为你@synthesize属性)

或者你可以省略ivar声明,让编译器也为你做这件事。像这样:

@interface Movie : NSObject

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

@end

希望有所帮助。