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


我刚刚掌握了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

谁能解释我哪里出错?


32
2017-12-03 13:59


起源




答案:


我假设你正在使用ARC。

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

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

所以,如果你这样做,伊娃  必须将__unsafe_unretained标记为匹配(如果您希望编译器为您合成@synthesize属性)

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

@interface Movie : NSObject

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

@end

希望有所帮助。


52
2017-12-03 14:12



很好的解释 - 谢谢! - bodacious
精辟的解释。感谢名单! - iOS Monster
是的,您只需要从ARC中的.h文件中删除ivar声明。 ie。,只省略“{NSString * title; int year; int rating;}” - james lobo