(原创)用代码来说明,更易于理解:delegate用assign而不使用retain
2012-08-17 11:18
369 查看
为什么delegate 用 assign 而不使用 retain。
网络上有介绍说明,但不是很直观明了,为了更易于理解,本人用代码来说话。先定义两个类:AAA
@interface AAA : NSObject @property (nonatomic, retain) id delegate; @end @implementation AAA @synthesize delegate; - (void)dealloc { [delegate release]; [super dealloc]; }
再来BBB:
@interface BBB : NSObject @property (nonatomic, retain) id delegate; @end @implementation BBB @synthesize delegate; - (void)dealloc { [delegate release]; [super dealloc]; }
如果有下面操作(.count表达为对象的引用计数器):
{ AAA aaa = [[AAA alloc] init]; // aaa.count = 1 BBB bbb = [[BBB alloc] init]; // bbb.count = 1 aaa.delegate = bbb; // bbb.count = 2 bbb.delegate = aaa; // aaa.count = 2 //do someting.......... [self dosomething]; [aaa release]; // aaa.count - 1 即结果:aaa.count = 1; // 由于引用计数器不为零,所以不会调用AAA类中的dealloc方法, // 所以不会调用[delegate release]; 此时delegate为bbb,所以bbb.count = 2 [bbb release]; //同理,bbb.count - 1 即结果:bbb.count = 1; // 由于引用计数器不为零,所以不会调用BBB类中的dealloc方法, // 所以不会调用[delegate release]; 此时delegate为aaa,所以aaa.count = 1 }
所以最终aaa,bbb的各自引用计数器还是为1,引用计数器为1就不会调用dealloc方法来释放里面的delegate,
造成aaa与bbb永远存在内存中,导致内存的泄漏。
所以delegate要用assign,不能用retain。
相关文章推荐
- 为什么delegate属性使用assign而不是retain?
- 为什么delegate 用 assign 而不使用 retain
- 为什么delegate 用 assign 而不使用 retain
- 为什么delegate 用 assign 而不使用 retain
- 为什么delegate属性使用assign而不是retain?
- 为什么delegate属性使用assign而不是retain?
- 为什么delegate 用 assign 而不使用 retain
- 为什么delegate 用 assign 而不使用 retain
- [原创]使用OPENCC库进行简繁转换(C++代码)
- 个人理解的IOS开发Objective-C中的属性readwrite,readonly,retain,assign,copy,nonatomic,strong,weak.
- Android 项目的代码混淆,Android proguard 使用说明
- 编写易于理解代码的六种方式-如何让您免受读不懂代码的折磨
- 完全新手对delegate使用的理解
- 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤
- C# 几行代码理解Delegate
- 图文说明如何使用T4在VS2008里生成代码
- 2015.7.30 第五堂(补)delegate 三部曲理解之二(使用协议)
- 理解assign,copy,retain变strong
- [原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
- 您希望通过将所有ArrayList对象替换为相应的泛型版本以提高应用程序的效率,并使得代码更易于使用。当结构体或其他值类型存储在这些数据结构中时,会导致装箱/拆箱操作,这时就需要这么做。