gpt4 book ai didi

objective-c - 为什么在Objective-C和iOS中,[[NSMutableArray alloc] init]发出警告,但NSMutableArray.new没有给出警告?

转载 作者:行者123 更新时间:2023-12-01 18:29:49 25 4
gpt4 key购买 nike

我有一个MainViewarr的属性

@property NSMutableArray *arr;

在我的 ViewController.m中,在 viewDidLoad中,如果我使用
MainView *mainView = (MainView *) self.view;
mainView.arr = [[NSMutableArray alloc] init];

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

那么就不会发出警告。我以为 alloc initnew相同?为什么第一个版本会发出警告,实际上是危险的还是可以发出警告,所以没有警告?

最佳答案

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

@property (strong, nonatomic) NSMutableArray *arr;

然后您的问题就解决了。

同样,您对 NSMutableArray.new的非标准用法缺乏警告并不表示没有问题,而是表明编译器并未为您生成警告。 (坦率地说,调用一种方法的点语法完全起作用,对此我感到非常惊讶。点表示法通常用于访问属性,而不是用于方法。)如果您确实想使用 [NSMutableArray new],请使用 new语法。但是首选的语法实际上是 [[NSMutableArray alloc] init]

注意警告。

关于objective-c - 为什么在Objective-C和iOS中,[[NSMutableArray alloc] init]发出警告,但NSMutableArray.new没有给出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10265122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com