iPhone/Mac Objective-C内存储器管理教程和原理剖析 3
版权声明
此文版权归作者 Vince Yuan (vince.yuan#gmail.com) 所有。欢迎非营利性转载,转载时必须包含原始链接 http://vinceyuan.cnblogs.com ,且必须包含此版权声明的完整内容。
版本 1.1 发表于 2010-03-08
三 @property (retain) 和 @synthesize 的默认实现
在这里解释一下 @property (retain) ClassB* objB; 和 @synthesize objB; 背后到底发生了什么 (retain property 的默认实现 ) 。 property 实际上是 getter 和 setter ,针对有 retain 参数的 property ,背后的实现如下(请参考附件中的 memman-getter-setter.m ,你会发现,结果和 memman-property.m 一样):
@interface ClassA : NSObject
{
ClassB *objB;
}
-(ClassB *) getObjB;
-(void) setObjB:(ClassB *) value;
@end
@implementation ClassA
-(ClassB*) getObjB
{
return objB;
}
-(void) setObjB:(ClassB*) value
{
if (objB != value)
{
[objB release];
objB = [value retain];
}
}
在 setObjB 中,如果新设定的值和原值不同的话,必须要把原值对象 release 一次,这样才能保证 retain count 是正确的。
由于我们在 class 内部 retain 了一次(虽然是默认实现的),所以我们要在 dealloc 方法中 release 这个成员变量。
-(void) dealloc
{
[objB release];
[super dealloc];
}