1

我有我的MainView班级的财产,arr

@property NSMutableArray *arr;

在我ViewController.m的里面viewDidLoad,如果我使用

MainView *mainView = (MainView *) self.view;
mainView.arr = [[NSMutableArray alloc] init];

它编译了,但给出了“将保留的对象分配给不安全的属性;分配后对象将被释放”的警告。但是如果我将上面的第二行更改为

mainView.arr = NSMutableArray.new;    

则不会有任何警告。我以为alloc init是一样的new?为什么第一个版本会发出警告,实际上它是危险的还是可以做到没有警告?

4

3 回答 3

2

如果您使用[NSMutableArray new]语法,您将看到警告,因此您的问题消失并不是问题,而是您的非标准语法NSMutableArray.new没有生成警告。问题是您的属性默认为 unsafe_unretained,每当您将保留对象分配给 unsafe_unretained 对象时,ARC 都会立即为您释放它。只需尝试将一个对象添加到您的数组,然后 NSLog'ing 它,您就会看到说明问题的 EXC_BAD_ACCESS。将您的财产更改为:

@property (strong, nonatomic) NSMutableArray *arr;

你的问题就消失了。

同样,您的非标准用法缺少警告NSMutableArray.new并不表示没有问题,而是编译器没有为您生成警告。(坦率地说,我真的很惊讶用于调用方法的点语法完全有效。点表示法通常用于访问属性,而不是用于调用方法。)[NSMutableArray new]如果你真的想使用new. 但首选语法确实是[[NSMutableArray alloc] init].

注意警告。

于 2012-04-22T04:35:19.953 回答
1

我认为您收到警告的原因是因为 arr 不是强参考。如果你尝试“@property (strong, nonatomic) NSMutableArray *arr;”,警告就会消失。

PS“(强,非原子)”是采用自动引用计数(ARC)时使用的方法。我也很惊讶 NSMutableArray.new 起作用了。我认为最好使用“[[NSMutableArray alloc] init]”。这样,Xcode 会告诉你你正在实例化的类是否有一个更合适的、特殊的初始化器(例如“initWithFrame:”)。

于 2012-04-22T04:18:13.860 回答
1

你必须告诉财产的类型。例如:

@property (retain) NSMutableArray *arr;

请参阅文档中的属性类型

于 2012-04-22T04:26:58.047 回答