当前位置:编程学习 > wap >>

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是个例外。
补充:移动开发 , IOS ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,