IOS,ARC,属性:(readwrite,nonatomic)vs(radwrite,retain,nonatomic)
Posted
技术标签:
【中文标题】IOS,ARC,属性:(readwrite,nonatomic)vs(radwrite,retain,nonatomic)【英文标题】:IOS, ARC, Property: (readwrite, nonatomic) vs (radwrite, retain, nonatomic) 【发布时间】:2013-03-20 02:48:08 【问题描述】:我已经阅读了一些关于 ARC 的教程,但对属性声明仍然有些困惑。我使用以下模式编写了大部分代码:
@property (readwrite, nonatomic) PlayerData* playerData;
@property (readwrite, nonatomic) MusicLayer* musicLayer;
@property (readwrite, nonatomic) bool isPowerUpAvailable;
现在我终于开始处理内存泄漏了,XCode 建议我在一些代码中应该在属性声明中添加“retain”关键字。
使用 ARC,我认为我不应该再“打扰”保留计数了。是否有一些我没有得到或缺少的概念?任何教程参考或解释将不胜感激。
【问题讨论】:
【参考方案1】:如果您希望继续使用您的代码,您可以仅在您想要的特定文件.m
上排除 ARC:
转到 Targets > Build Phases > Compile Sources 并选择您的 .m
文件双击选择的右列并添加 -fno-objc-arc
这样您就可以排除 ARC
仅选定的文件.
或者,如果您想使用 ARC 将所有应用程序转换为新代码,请在备份您的项目后,转到:
编辑 > 重构 > 转换为 Objective-C ARC 并在此之后执行相同操作,但点击 转换为现代 Objective-C Sintax
这里是屏幕:
注意不要总是在尝试复制您的项目之前工作!
希望对你有帮助
【讨论】:
【参考方案2】:ARC 将根据属性声明保留对象,您应该将strong
用于需要保留的属性,将weak
用于不需要保留的属性。
weak
属性在对象被释放时也会被清零。
编译器将始终假定属性为readwrite
,因此无需以这种方式声明。
@property (strong, nonatomic) PlayerData* playerData;
@property (strong, nonatomic) MusicLayer* musicLayer;
// Need use assign since strong is for objects only.
@property (assign, nonatomic) bool isPowerUpAvailable;
【讨论】:
谢谢,由于 SO,只能在 5 分钟内接受答案。想知道..在哪些情况下我需要弱参考?我是否正确地说,对于“大多数”情况,首选强参考? 是的,在大多数情况下strong
可以,但是对于delegate
属性weak
会更好,因为委托也可以保留它作为委托的对象。
例如,如果我在一个类中创建一个对象(比如 A),然后在 B 的构造函数中传递这个对象,那么我应该将 B 中的“接收”指针声明为 delagate 属性吗?
不,这只是一个普通属性,委托是当一个对象调用另一个类的方法时,就像UITableView
在用户选择一行时所做的那样。由于这些调用大多是委托和所有者,所以使用了一些 weak
。
如果你没有泄漏(使用分析器和分析器)你应该没问题。以上是关于IOS,ARC,属性:(readwrite,nonatomic)vs(radwrite,retain,nonatomic)的主要内容,如果未能解决你的问题,请参考以下文章