2010-11-05 17:40:25| 分类: objective c | 标签: |举报 |字号大中小 订阅
版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所有。欢迎非营利性转载,转载时必须包含原始链接http://vinceyuan.cnblogs.com,且必须包含此版权声明的完整内容。
版本 1.0 发表于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]; }
补充说明 在研究retain count的时候,我不建议用NSString。因为在下面的语句中, NSString *str1 = @”constant string”; str1的retain count是个很大的数字。Objective-C对常量字符串做了特殊处理。 当然,如果你这样创建NSString,得到的retain count依然为1 NSString *str2 = [NSString stringWithFormat:@”123”]; |
评论