autorelease不是garbage collection,完全不同于Java或者.Net中的GC。
autorelease和作用域没有任何关系!
autorelease原理:
1.先建立一个autorelease pool
2.对象从这个autorelease pool里面生成。
3.对象生成之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。
被标为autorelease的对象,并不是等程序结束时才release,如:在viewDidLoad中创建一个autorelease对象,在viewDidLoad走完,一次消息循环完毕,这个autorelease pool中的对象就会被release,button的点击事件,点击代码执行完会release一下autolease类型的变量)
上面这个例子应该这样写:
ClassName *myName = 【[[ClassName alloc] init] autorelease];//标记为autorelease
[classA setName:myName]; //retain count == 2 (
如果myName的属性是retain的话
)
[myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否则release pool时会release这个retain count为0的对象,这是不对的。
记住一点:如果这个对象是你alloc或者new出来的,你就需要调用release。如果使用autorelease,那么仅在发生过retain的时候release一次(让retain count始终为1)。