首页 > 技术文章 > 内存管理

tcsong24 2016-07-05 11:16 原文

不要使用任何刚释放的内存,否则可能无用陈旧的数据,从而引发各种各样的错误,而且如果该内存已经加载了其他数据,将会破坏这些新数据。
 
- (id) retain;
- (oneway void) ralease;
- (NSUInteger) retainCount;
当使用alloc、new方法或者通过copy消息创建一个对象时,对象的保留计数器值被设置为1。要增加对象的保留计数器的值,可以给对象发送一条retain消息。要减少的话。可以给对象发送一条release消息。
 
Cocoa中有一个自动释放池(autorelease pool)的概念。
有两种方法可以创建一个自动释放池:通过@autoreleasepool关键字;通过NSAutoreleasePool对象。
 
内存管理的一些小规则:
当你使用new、alloc、或cpoy方法创建一个对象时,该对象的保留计数器的值为1。当不再使用该对象时,应该向该对象发送一条release或autorelease消息。这样,该对象就爱那个在其使用寿命结束时被销毁。
当通过其他方法获得一个对象时,假设该对象的保留计数器的值为1,而且已经被设置为自动释放,那么不需要执行任何操作来确保该对象得到清理。如果打算在一段时间内使用该对象,则需要保留它并确保在操作完成时释放它。
如果保留了某个对象,就需要释放或自动释放该对象,必须保持retain方法和release方法的使用次数相等。
 
arrayWithCapacity:方法与alloc、new、copy方法不同,假设该对象被返回时保留计数器的值为1且已经被设置为自动释放。当自动释放池被销毁时,向array对象发送release消息,该对象的保留计数器的值归0,其占用的内存被回收。
 
自动释放池以栈的形式实现:当创建了一个新的自动释放池时,就被添加到栈顶。接收autorelease消息的对象将被放入到最顶端的自动释放池中。如果将一个对象放入一个自动释放池中,然后创建一个新的自动释放池,再销毁该新建的自动释放池,则这个自动释放池对象仍将存在,因为容纳该对象的自动释放池仍然存在。
 
垃圾回收机制会对移动设备产生非常不利的影响,因为移动设备比电脑更私人化,资源更少。用户可不想再玩游戏或打电话时因为系统突然进行内存清理而卡住。
 
自动引用计数(automatic reference counting, ARC)
想在代码中使用ARC,需满足一下三个条件:
能够确定哪些对象需要进行内存管理:对象的最上层集合知道如何管理它的子对象。
能够表明如何去管理对象:必须能够对某个对象的保留计数器的值进行加1或减1的操作。
有可行的方法传递对象的所有权:传递对象的时候,程序需要在调用者和接收者之间传递所有权。
 
程序会创建一个NSException实例来抛出异常,并会使用以下两种技术之一:
使用”@throw 异常名:”语句来抛出异常;
向某个NSException对象发送raise消息。
throw theException;
[theException raise]; 

推荐阅读