Objective C----手动管理内存和自动管理内存

对象的引用计数(Reference Counting)

正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1;当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象;当对象的引用计数为0时,表明程序已经不再需要该对象,系统就会回收该对象所占用的内存。

Ø  当程序调用方法名以alloc、new、copy、mutableCopy开头的方法来创建对象时,该对象的引用计数加1。

Ø  程序调用对象的retain方法时,该对象的引用计数加1。

Ø  程序调用对象的release方法时,该对象的引用计数减1。

NSObject 中提供了有关引用计数的如下方法:

Ø  —retain:将该对象的引用计数器加1。

Ø  —release:将该对象的引用计数器减1。

Ø  —autorelease:不改变该对象的引用计数器的值,只是将对象添加到自动释放池中。

Ø  —retainCount:返回该对象的引用计数的值。

 

自动释放池

为了实现被函数、方法返回的对象能被延迟销毁,有如下两种做法:

Ø  程序每次获取并使用完其他方法、函数返回的对象之后,立即调用该对象的release方法将函数、方法返回对象的引用计数减1。

Ø  使用自动释放池进行延迟销毁。

手动内存管理的规则

Ø  调用对象的release方法并不是销毁对象,只是将该对象的引用计数减1;当一个对象的引用计数为0时,系统会自动调用该对象的dealloc方法来销毁该对象。

Ø  当自动释放池被回收时,自动释放池会依次调用池中每个对象的release方法。如果该对象调用release方法后引用计数变为0,那么该对象将要被销毁;否则该对象可以从自动释放池中“活”下来。

Ø  当程序使用alloc、new、copy、mutableCopy开头的方法创建对象后,该对象的引用计数为1,当不再使用该对象时,需要调用该对象的release方法或者autorelease方法。

Ø  如果使用retain方法为对象增加过引用计数,则用完该对象后需要调用release方法来减少该对象的引用计数,并保证retain次数与release次数相等。

Ø  如果通过其他方法获取了对象,且该对象是一个临时对象,如果在自动释放上下文中使用该对象,那么使用完成后无须理会该对象的回收吗,系统会自动回收该对象。如果程序需要保留这个临时对象,则需要手动调用retain来增加该临时对象的引用计数;或者将该临时对象赋值给retain、strong、copy指示符修饰的属性。

Ø  在Cocoa或iOS的事件循环中,每个事件处理方法执行之前会创建自动释放池,方法执行完成后会回收自动释放池。如果希望自动释放池被回收后,池中某些对象能“活”下来,程序必须增加该对象的引用计数,保证该对象的引用计数大于它调用autorelease的次数。

自动引用计数(Automatic Reference Counting)

iOS 5引入ARC机制

选中TARGETS分类下的项目名,在编辑区上方单击Build Settings标签页,在此标签页搜索Objective-C

AutomaticReference Counting选项,如果将该选项设为Yes,表明启用ARC,设为No则表明关闭ARC选项。

为了单独关闭某个文件的ARC机制,可单击图1所示窗口上方的Build Phases标签页,然后展开Compile Sources分类列表,即可看到项目中所有的源代码。接下来就可以对指定的源代码添加-fno-objc-arc编译选项,如图2所示。

posted @ 2015-11-05 14:38    阅读(342)  评论(0编辑  收藏  举报