【问题标题】:didRecieveMemoryWarning in ARC (iOS / Obj-C)方舟中的 didReceiveMemoryWarning (iOS / Obj-C)
【发布时间】:2012-05-22 12:38:29
【问题描述】:

我有一个使用 ARC(自动引用计数)的 iOS (Obj-C) 项目。根据 Apple 文档和纯粹的实验,您不能有以下陈述:

[UIThingamabob release];

这是以前在分配或保留后释放项目的方式。现在我知道您必须管理 IB 对象的创建方式

@property (nonatomic, retain) IBOutlet ...

头文件的一部分。

对于我的所有 IB 项目,我一直按原样使用上述语句(使用非原子和保留(或强-无论如何有什么区别,它们是如何使用的?)属性)。当我在 iOS 设备上进行测试时,我会随机获得一个 UIAlertView(我为调试目的创建的),它仅在 didRecieveMemoryWarning 事件被触发时显示。

我的一些 BETA 测试人员不停地被这些视图轰炸,直到他们设法退出应用程序。

我的问题是,由于无法释放对象,我应该在 didRecieveMemoryWarning 事件中添加什么?如果没有任何东西可以放在那里,那么这些错误是由于我使用 @property 函数创建对象的方式而发生的吗?

【问题讨论】:

    标签: objective-c ios debugging automatic-ref-counting didreceivememorywarning


    【解决方案1】:

    您应该为所有 IBOutlets 使用@property (nonatomic, weak) IBOutlet...。如果你使用strong,视图控制器和它的超级视图会保留插座。当视图消失时,视图控制器仍然有对该插座的引用,该插座不再可见。您可以在-viewDidUnload 中将 outlet 属性设置为 nil,或者通过使用弱设置,当视图消失时,指针指向 nil 会自动完成。

    【讨论】:

    • +1 好点^^。但是,对于 NIB 中的外部对象(即视图层次结构之外),您可能仍希望使用 strong 以便它们不会立即被释放。
    • @borrrden:没有什么可以在视图层次结构之外,尽管视图可以是顶级的,并且应该是强引用。窗口是其他一切的超级视图。
    • @JacquesCousteau 让我举个例子。我的视图层次结构中有几个切换按钮,为了确保每个部分一次只单击一个,我在顶层的 nib 中插入一些基于 NSObject 的组对象作为类型“对象”。由于它们不是 UIViewController 视图的子视图,实际上根本没有显示,这就是我在视图层次结构之外的意思。如果我没有强烈引用它们,它们将在创建时被释放。
    • @borrrden:哦,我明白了,非视图对象。
    • 顺序是否重要:(弱,非原子)或(非原子,弱)?另外,很好的答案!
    【解决方案2】:

    您不应在@property 语句中使用retain。 ARC 选项为assignweakstrong。有关详细信息,请参阅此处:

    https://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

    特别是要检查Property Attributes部分!

    编辑:感谢 cmets,retainstrong 现在似乎是等价的。

    【讨论】:

    • 这真的很有帮助,+1,但是如果出现内存警告,我应该如何使用 ARC 处理它?
    • 保留仍然完全有效,请参见此处:clang.llvm.org/docs/…
    • 我认为strong和retain是类似的。
    • 好的,我应该更仔细地阅读。我想您应该更加小心必不可少的属性(即强/保留属性),并为其他所有内容使用弱/分配。如果你所有的属性都很强大,ARC 就无法完成它的工作;)
    • @thundersteele 最大的问题是保留周期(即相互强引用的属性)。您使用弱引用来打破保留周期:)。如果你不这样做,那么这些对象将永远不会被释放。尽可能多地使用弱无济于事,当出现内存警告时,您需要将对象清零。这将帮助他们走上解除分配的道路。
    【解决方案3】:

    没有看到你的项目就不可能知道该怎么做,但你可以做如下事情:

    清除以后可以重新生成的数据数组。清除缓冲区。将当前未使用的对象设置为 nil(如果它们没有保留在其他地方,则会释放它们)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2015-07-13
      相关资源
      最近更新 更多