Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 现有ivar&x27;标题';对于不安全的未修复财产';标题';必须是不安全的_Objective C - Fatal编程技术网

Objective c 现有ivar&x27;标题';对于不安全的未修复财产';标题';必须是不安全的

Objective c 现有ivar&x27;标题';对于不安全的未修复财产';标题';必须是不安全的,objective-c,Objective C,我刚刚开始学习Objective-C2.0 当我尝试在Xcode中构建以下代码时,它失败了。编译器的错误如下所示: 不安全/未维护财产“所有权”的现有ivar“所有权”必须是不安全/未维护的。 // main.m #import <Foundation/Foundation.h> #import "Movie.h" int main (int argc, const char * argv[]){ Movie *movie = Movie.new; NSLog(@"

我刚刚开始学习Objective-C2.0

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

不安全/未维护财产“所有权”的现有ivar“所有权”必须是不安全/未维护的。

// 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
//main.m
#进口
#导入“Movie.h”
int main(int argc,const char*argv[]{
Movie*Movie=Movie.new;
NSLog(@“%@”,电影);
返回0;
}
//电影
#进口
@接口电影:NSObject{
NSString*标题;
国际年;
国际评级;
}
@属性(分配)NSString*标题;
@财产(转让)评级;
@物业(转让)年;
@结束
#导入“Movie.h”
@实施电影;
@综合标题;//这似乎是个问题,但我不明白为什么?
@综合评分;
@综合年;
@结束

谁能解释一下我哪里出错了吗?

我想你是在用ARC

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

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

因此,如果您这样做,ivar也必须标记为“不安全”未恢复以匹配(如果您希望编译器为您@synthesis属性)

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

@interface Movie : NSObject

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

@end

希望这会有所帮助。

是的,您只需要从ARC中的.h文件中删除ivar声明。例如,只需省略“{NSString*title;int year;int rating;}”