我当时正在读一本书,其中建议当我的应用程序收到内存不足的警告时,应该将我的IBOutlets声明为weak。例如,我不再需要在viewDidUnload方法中将这些出口设置为零。
我在iOS6中也听说过,viewDidUnload被废弃了,取而代之的是调用didReceiveMemoryWarning。
无论如何,我该怎么做呢,我应该宣布我的IBOutlet为weak,而“忘记”实现didReceiveMemoryWarnings和viewDidUnloads吗?
发布于 2013-08-22 11:57:27
并不是所有的IBOutlets都应该是weak。来自苹果文档(资源编程指南)的推荐
插座通常应该是弱的,除了那些从文件的所有者到顶级对象在一个nib文件(或者,在iOS中,一个故事板场景)应该是强大的。因此,您创建的出口通常应该是弱的,因为:
示例:
XIB中的顶级对象应该声明为strong,任何其他子视图/控件都应该是weak属性。
@property (nonatomic, weak) IBOutlet MyView \*viewContainerSubview; @property (nonatomic, strong) IBOutlet MyOtherClass \*topLevelObj;
使用ARC weak生存期限定符有其自身的优点(参考苹果文档),因为,
__weak指定不保持引用对象活动的引用。当没有对对象的强引用时,弱引用设置为零。
因此,您不必担心设置IBOutlets nil,它的生存期会自动由其顶层实例绑定。
应该实现didReceiveMemoryWarning来清除占用内存的任何可重新创建的资源。当您接收到didReceiveMemoryWarning调用时,它应该用于释放使用ex的非关键资源:自定义数据结构、用于填充UI的webservice响应等等。任何资源的非关键度都需要由开发人员来决定。
发布于 2013-08-22 11:23:40
使用IBOutlet作为弱项是明智的。当您将它们声明为强时,在内存不足的情况下,可能需要在viewDidUnload方法中处理它们。
然而,除了出口之外,还有更多的对象可以在内存问题上从内存中移除。因此,如果程序的出口很弱,您只需要考虑缓存的数据对象并注意其他内容。
发布于 2013-08-22 11:27:53
根据苹果的文档
内存是iOS中的关键资源,视图控制器为在关键时刻减少内存占用提供了内置支持。didReceiveMemoryWarning类通过其释放不需要的内存的UIViewController方法提供了一些低内存条件的自动处理。
在iOS 6之前,当发生低内存警告时,UIViewController类如果知道可以重新加载或重新创建视图,则会清除视图。如果发生这种情况,它还将调用viewWillUnload和viewDidUnload方法,使代码有机会放弃与视图层次结构关联的任何对象的所有权,包括从nib文件加载的对象、在viewDidLoad方法中创建的对象以及在运行时延迟创建并添加到视图层次结构中的对象。在iOS 6上,视图永远不会被清除,这些方法也不会被调用。如果您的视图控制器需要在内存不足时执行特定任务,那么它应该覆盖didReceiveMemoryWarning方法。
因此,不需要将任何IBOutlet引用设置为nil,因为视图不再被清除。在didReceiveMemoryWarning或类似that.But中将它们设置为零是没有意义的,如果您是通过轻松释放重新创建的模型对象、清空缓存等来响应低内存事件的话,那么这些东西肯定会转移到didReceiveMemoryWarning。
https://stackoverflow.com/questions/18378866
复制相似问题