【问题标题】:IOS, ARC, Property: (readwrite, nonatomic) vs (radwrite, retain, nonatomic)IOS,ARC,属性:(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,我认为我不应该再“打扰”保留计数了。是否有一些我没有得到或缺少的概念?任何教程参考或解释将不胜感激。

【问题讨论】:

    标签: ios memory-management cocos2d-iphone automatic-ref-counting


    【解决方案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
      • 如果你没有泄漏(使用分析器和分析器)你应该没问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多