2010-04-11 51 views
0

我已經完成了Objective-C的方式,當時和最近(即剛剛)讀取Apple網站上關於使用retainrelease的文檔。但是,在他們的Creating an iPhone Application頁一些代碼有我有點糊塗:關於蘋果參考庫中保留/釋放語義的基本問題

- (void)setUpPlacardView 
{ 
    // Create the placard view -- it calculates its own frame based on its image. 
    PlacardView *aPlacardView = [[PlacardView alloc] init]; 
    self.placardView = aPlacardView; 
    [aPlacardView release]; // What effect does this have on self.placardView?! 
    placardView.center = self.center; 
    [self addSubview:placardView]; 
} 

沒有看到整個班級,似乎self.placardView也是PlacardView *和它aPlacardView分配不似乎表明它會保留對它的引用。因此,在我看來,我評論過的行([aPlacardView release];)可能導致aPlacardView的保留計數爲0,因此被解除分配。由於self.placardView指向它,現在不會指向釋放內存並導致問題嗎?

回答

3

我做的Objective-C遙想當年,

嗨,OBJ-C介紹性質在此期間的(邪惡)的概念。需要注意的是

self.placardView=xxx; 

self->placardView=xxx; 

是不同的。根據定義,前者稱[self setPlacardView:xxx],後者則將xxx分配給成員。 現在,當你看着MoveMeView.h,你看行

@property (nonatomic, retain) PlacardView *placardView; 

MoveMeView.m

@synthesize placardView; 

這些告訴編譯器生成-setPlacardView:placardView適當,使用標準保留/釋放語義。有關更多詳細信息,請參閱Apple的properties的文檔。

+0

屬性的概念並不邪惡,它是Apple引入的點符號時間。它污染了語法並導致無盡的混淆。就我個人而言,我使用很多屬性,但我使用普通的Objective-C語法來獲取和設置它們。 – JeremyP 2010-04-11 19:22:21

+0

是的,我同意這一點。這就是爲什麼我在邪惡一詞前面加上括號。對我來說,點符號完全可以;我總是提醒自己,這些都是方法調用。但我衷心地認爲這對初學者來說是一個很大的混亂。 – Yuji 2010-04-11 22:27:41

1

兩件事情要指出;

如果屬性placardView被定義爲保留(@property(retain)...),那麼self.placardView將調用編譯器生成的setter,該setter將包含一個retain。

剛纔這個對你來說是新的,屬性和相關的@synthesize告訴編譯器生成- (void)setPlacardView:(UIView *)view- (UIView *)placardView方法。

另一件需要注意的事項; addSubview:保留給定的視圖。因此,如果沒有該版本,該視圖的保留計數爲2.發佈並隨後添加爲子視圖會使您保留計數爲1.