著作權聲明
此文著作權歸作者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];
}
範例程式碼檔案連結:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip