在ios5.0 dev的page325中,说到了保留周期的问题
1,什么是保留周期:
它指的是这样一种情况:两个或者更多对象以一种循环的方式相互保留。
只要有两个需要引用对方的对象,通常就希望“所有者”对象保留另一个对象,但另一个对象绝对不能保留它的所有者。
这也就是为什么像控件对象的代理属性都是弱属性了。
因为代理对象比如MyViewController持有UITextField的控件对象。那么UITextFiled对象的属性是强属性,因为MyViewController对象保留UITextFiled对象。
UITextFiled对象自己会有Delegate属性,那么Delegate这个对象一般是MyViewController,那么UITextFiled对象保留MyViewController对象(也就是Delegate对象),
MyViewController对象为弱属性(也就是Delegate对象).如果Delegate对象也是强属性的话,他们就相互保留了,引用计数器永远都是1,他们永远不被释放了.
、、、、、、、、、、、、、、、、、、、、、、、、、、
delegate为什么用弱引用?
比如在A页面设置B的delegate为A的实例,
// A.m中某处
B* b = [B alloc] init];
b.delegate = self;
[self.view addSubview:b];
[b release];
那么
1.是A负责创建B的,A的生命周期一定比B要长(B存在,A一定也存在;A存在,B不一定存在)
也就是说 在B(实例b)存在的时候,A(的实例)一定存在, 所以没有必要用retain将引用计数+1,assign足以
2.退一步假设存在这样的情况:A比B先挂掉(A的实例先被release销毁)
那么当然希望是[a relase]后,A中的方法不再被B调用,但是使用retain时候,A还是没有被销毁,所以 A中的方法仍会被B调用,但是assgin就无此问题
3.本质上delegate就是一根指向先于它存在的某个类(CCClass)的指针(假设是:ccPoint),我们通过delegate这根指针去指向这个已经存在的指针(ccPoint) 那么通过delegate即ccPoint也就可以访问CCClass中的实例方法
4.避免retain cycle,即:有A,B两个Object, A中有一个B的实例变量,B中又有一个A的实例变量,要release A就必须releaseA中的B,而要release B有必须release B中的A,这样就产生了一个Retain Circle,A B都不能被dealloc.解决Retain Circle的方法就是使用弱引用(weak reference),弱引用没有被引用的那个Object的所有权,也就不需要release它,从而解决了Retain Circle问题.为了防止Retain
Circle的发生, delegate通常都是弱引用的, 因此我们一般不应该retain一个delegate。NSURLConnection是个例外。