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

bod*_*ous 32 objective-c

我刚刚掌握了Objective-C 2.0

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

unsafe_unretained属性'title'的现有ivar'title'必须是__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
Run Code Online (Sandbox Code Playgroud)

谁能解释我哪里出错了?

Fir*_*eer 54

我假设您正在使用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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.