首页 » iOS编程基础:Swift、Xcode和Cocoa入门指南 » iOS编程基础:Swift、Xcode和Cocoa入门指南全文在线阅读

《iOS编程基础:Swift、Xcode和Cocoa入门指南》12.6 实例属性的内存管理

关灯直达底部

在ARC之前,管理实例属性(参见第10章关于Objective-C实例变量的介绍)的内存是Cocoa编程中最棘手的困难之一。正确的行为应该是在给属性赋值时保持一个引用类型的对象,在如下两种情况中将其释放:

·为相同的属性赋予了不同的值。

·实例属性所在的实例被销毁了。

为了遵循内存管理的黄金法则,负责内存管理的对象(即所有者)显然需要是该实例属性所在的对象。要想确保能够正确地对属性的内存进行管理,唯一的做法就是在该属性的setter方法中进行实现。setter需要释放该属性当前值所对应的那个对象,然后保持赋给该属性的对象。具体细节是很烦琐的(它们要是同一个对象该怎么办),在ARC出现之前,程序员很容易出错。当然,内存管理不只这些;为了防止所有者销毁所导致的内存泄漏问题,我们需要实现所有者的dealloc方法(对应于Objective-C的deinit)来释放掉作为属性值而保持的每个对象。

幸好,ARC对此完全理解,它会帮你正确地管理好实例属性的内存,就像所有变量的内存一样。

这一事实也让我们知道该如何根据需要释放对象,这么做非常有价值,因为一个对象可能会使用大量内存。你不希望对设备的内存造成太大的压力,因此在使用完对象后就需要将其释放。此外,当应用进入后台并挂起时,如果发现它使用了过多的内存,那么Watchdog进程就会在后台终止它;因此,当知道应用将要进入后台时,你可能想要释放该对象(第3章对此作过介绍)。

你不能(也不可以)显式调用release,因此需要另辟蹊径,所采用的方式应该与ARC的设计和行为保持一致。解决办法就是将另外的值(占用较少内存)赋给该属性。这会导致该属性之前的值被释放。常见的做法是将该属性的类型声明为Optional,即从而简化隐式展开Optional等。这意味着可以将nil赋给它,这么做纯粹是为了释放当前值。