background image

[obj1 hello]; //输出 hello
[obj1 release]; //retain count = 0,对象被销毁
[obj2 hello];
[obj2 release]; 
         [obj1 release]之后,obj2 依然是个无效指针。问题依然没有解决。解决方法见下一条。

4
Objective-C 指针赋值时,retain count 不会自动增加,需要手动 retain。
ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1
ClassA *obj2 = obj1; //retain count = 1
[obj2 retain]; //retain count = 2
[obj1 hello]; //输出 hello
[obj1 release]; //retain count = 2 – 1 = 1
[obj2 hello]; //输出 hello
[obj2 release]; //retain count = 0,对象被销毁
问题解决!注意,如果没有调用

[obj2 release],这个对象的 retain count 始终为 1,不会被销

毁,内存泄露。

(1-4 可以参考附件中的示例程序 memman-no-pool.m)

这样的确不会内存泄露,但似乎有点麻烦,有没有简单点的方法?见下一条。

5
Objective-C 中引入了 autorelease pool(自动释放对象池),在遵守一些规则的情况下,可
以自动释放对象。(

autorelease pool 依然不是.Net/Java 那种全自动的垃圾回收机制)

5.1
新生成的对象,只要调用

autorelease 就行了,无需再调用 release!

ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1 但无需调用 release

5.2
对于存在指针赋值的情况,代码与前面类似。
ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1
ClassA *obj2 = obj1; //retain count = 1
[obj2 retain]; //retain count = 2
[obj1 hello]; //输出 hello
//对于 obj1,无需调用(实际上不能调用)release
[obj2 hello]; //输出 hello
[obj2 release]; //retain count = 2-1 = 1

细心的读者肯定能发现这个对象没有被销毁,何时销毁呢?谁去销毁它?(可以参考附件
中的示例程序

memman-with-pool.m)请看下一条。

6
autorelease pool 原理剖析。(其实很简单的,一定要坚持看下去,否则还是不能理解
Objective-C 的内存管理机制。)
6.1
autorelease pool 不是天生的,需要手动创立。只不过在新建一个 iphone 项目时,xcode 会自