@property (retain)和@synthesize的預設實現
在這裡解釋一下@property (retain) ClassB* objB;和@synthesize objB;背後到底發生了什麼(retain property的預設實現)。property實際上是getter和setter,針對有retain引數的property,背後的實現如下(請參考附件中的memman-getter-setter.m,你會發現,結果和memman-property.m一樣):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@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這個成員變數。
1 2 3 4 5 |
-(void) dealloc { [objB release]; [super dealloc]; } |
示例程式碼檔案連結:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip