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)的主要内容,如果未能解决你的问题,请参考以下文章

非ARC开发的内存管理

非ARC开发的内存管理

iOS 属性关键字

使用ARC为ios声明只读属性的正确方法是啥

OC 属性修饰符篇

容易导致循环引用的场景的解决方案