自动ARC转换后:将保留的对象分配给不安全的属性; 对象将在分配后释放

Ken*_*and 29 xcode ios automatic-ref-counting

我刚刚使用Xcode的自动重构将旧项目转换为ARC.

@property (nonatomic, retain) NSMutableArray *cards;
Run Code Online (Sandbox Code Playgroud)

被替换为:

@property (nonatomic) NSMutableArray *cards;
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我读到的是"强"是默认状态.但是,以下行给出了标题中的错误:

self.cards = [[NSMutableArray alloc] initWithCapacity:54];
Run Code Online (Sandbox Code Playgroud)

通过strong在以下保留的位置添加回来解决错误:

@property (nonatomic, strong) NSMutableArray *cards;
Run Code Online (Sandbox Code Playgroud)

但是......如果我需要回过头strong来处理每个@property声明,那么retain为什么ARC重构将它们全部删除?

nsc*_*hum 44

我遇到了同样的警告,并开了一个技术支持事件.由于ARC内部的一致性,工程师验证默认值已从"assign"更改为"strong".

他说警告和文件都是错误的并且将被修复.在此之前,我会完全避免隐含的默认值!

明确添加"强"(正如BJ荷马建议的那样)是一种安静的方法来使警告静音并兼容.但是,不要假设默认情况下不返回属性.总是把"弱"或"分配"放在那里.

编辑:clang文档现在正式记录了这一变化.警告已得到修复.

编辑2:Xcode 4.4显然包括修复.


mat*_*way 8

它转换nonatomic, retain为它看起来是错误的nonatomic.我一直看到它转换为nonatomic, strong.如果你能够制作一个简单的项目,以你看到它的方式转换,那么我建议用它来提交雷达.

我假设您正在使用最新的Xcode.

  • 是的,遗憾的是,这是4.3.1中的一个已知错误.我前几天自己报道了.最简单的解决方法是简单地用`strong\1`替换`retain(,| \))`的项目正则表达式.然后再次运行ARC转换. (2认同)