1

我正在读一本书,这表明当我的应用程序收到低内存警告时,声明我IBOutlets的 asweak应该解决这个问题。例如,我现在不需要viewDidUnload方法中将这些出口设置为零。

我还听说在 iOS6viewDidUnload中已弃用,取而代之didReceiveMemoryWarning的是被调用。

无论如何,我该如何继续,我应该将我IBOutlet的 s 声明为weak,并“忘记”实施didReceiveMemoryWarningsandviewDidUnloads吗?

4

4 回答 4

2

不是所有的都IBOutlets应该做weakApple 文档的推荐(资源编程指南)

出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,您创建的 Outlets 通常应该很弱,因为:

  • 您为例如视图控制器的视图或窗口控制器的窗口的子视图创建的 Outlets 是对象之间的任意引用,并不暗示所有权。

  • 强插座经常由框架类指定(例如,UIViewController 的视图插座,或 NSWindowController 的窗口插座)。

例子:

应声明 XIB 中的顶级对象,应将strong任何其他子视图/控件设为weak属性。

    @property (nonatomic, weak)   IBOutlet MyView *viewContainerSubview;
    @property (nonatomic, strong) IBOutlet MyOtherClass *topLevelObj;

使用 ARCweak生命周期限定符有其自身的优势(请参阅 Apple 文档),因为,

__weak 指定一个不使被引用对象保持活动状态的引用。当对象没有强引用时,弱引用设置为 nil。

所以你不必担心设置IBOutlets nil,它的生命周期会自动被它的顶级实例绑定。

didReceiveMemoryWarning应该实施以清除任何占用内存的可重新创建资源。当您收到didReceiveMemoryWarning调用时,它应该用于释放使用的非关键资源,例如:自定义数据结构、用于填充 UI 的 Web 服务响应等。任何资源的非关键性需要由开发人员决定。

于 2013-08-22T11:57:27.853 回答
0

建议使用弱的 IBOutlet。当您将它们声明为强时,在内存不足的情况下,您可能需要在 viewDidUnload 方法中处理以清除它们。

但是,除了 Outlets 之外,还有更多对象可以在内存问题的情况下从内存中删除。因此,如果程序的出口很弱,您只需要考虑缓存的数据对象并注意其他事项。

于 2013-08-22T11:23:40.070 回答
0

根据苹果的文档

内存是 iOS 中的关键资源,视图控制器提供内置支持以减少关键时刻的内存占用。UIViewController 类通过其didReceiveMemoryWarning方法提供了一些低内存条件的自动处理,该方法释放不需要的内存。

在 iOS 6 之前,当发生内存不足警告时,如果 UIViewController 类知道以后可以重新加载或重新创建它们,则它会清除其视图。如果发生这种情况,它还会调用viewWillUnloadviewDidUnload方法,让您的代码有机会放弃与视图层次结构关联的任何对象的所有权,包括从 nib 文件加载的对象、在 viewDidLoad 方法中创建的对象以及创建的对象在运行时懒惰地添加到视图层次结构中。在 iOS 6 上,视图永远不会被清除,并且这些方法永远不会被调用。如果您的视图控制器需要在内存不足时执行特定任务,它应该覆盖didReceiveMemoryWarning方法。

因此,无需在任何地方将任何 IBOutlet 引用设置为 nil,因为不再清除视图。在 didReceiveMemoryWarning 或类似的东西中将它们设置为 nil 是没有意义的。但是,如果您通过在 viewDidUnload 中释放易于重新创建的模型对象、清空缓存等来响应低内存事件,那么这些东西肯定应该移至 didReceiveMemoryWarning。

于 2013-08-22T11:27:53.153 回答
0

自 iOS6 以来,视图不再自动卸载内存警告。当然,这并不意味着内存使用不再是问题,您不能只是“忘记”它。

IBOutlets 通常应该是weak,因为它们(直接或间接)由视图控制器的视图“拥有”。通常您希望他们的生命周期与他们的父视图相同。

您仍然应该尝试在 didReceiveMemoryWarning 中尽可能多地清除内存。(当前未使用的资产的内存,当然可以重新创建)

于 2013-08-22T11:34:54.127 回答