2011-07-27 64 views
0

可能重複:
Difference between calling self.var vs var自己的財產:有或沒有相同的代碼自

編輯:其實,我不明白,一個數組確實增加了一個對象不需要一個「setter」,但實際上是一個「getter」,所以使用「self」並不重要。

你能告訴我爲什麼在這段代碼中我們有時會使用「自我」。有時我們不:如果我們有一個「信息」發送到屬性,我們通常用「自我」,但在這裏的LocationManager委託爲例,我們不使用它:

- (void)viewDidLoad { 
    self.locationMeasurements = [NSMutableArray array]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    [locationMeasurements addObject:newLocation]; 

- (void)viewDidUnload { 
    locationDetailViewController = nil; 
} 


- (void)reset { 
    [self.locationMeasurements removeAllObjects]; 
} 

感謝您的幫助

保羅

+1

此** viewDidUnload **方法可能會導致內存泄漏。 –

+0

您可能會發現這個有用的:http://stackoverflow.com/questions/2385980/objective-c-when-to-use-self – Luke

+0

感謝您的鏈接,我也想知道爲什麼我們使用第一個「自我」。然後對於我們選擇直接設置伊娃而不使用訪問器的相同屬性... – Paul

回答

1

當您使用自您通過存取方法,從而充分利用財產屬性,如非原子(或原子)讀取或拷貝時,保留,轉讓分配時。

當你不使用自我時,你直接訪問變量。

實施例:

@interface X : NSObject 
{ 
    NSObject * anObject; 
} 
@property(nonatomic,retain) NSObject * anObject; 

self.anObject = [[NSObject alloc]init]autorelease]; 

將保留對象的屬性

anobject = [[NSObject alloc]init]autorelease]; 

將不保留它,該對象將在稍後釋放。

自我。是語法糖:

-(NSObject *)anObject; 

and 

-(void)setAnObject:(NSObject *)other; 

在你的財產申報的屬性定義這些方法是怎樣的情景

在viewDidLoad中的示例代碼的自我背後實施。可能需要確保分配後數組保留。然而,在「重置」中,可能不需要您操作對象本身,也不需要對屬性進行賦值(除非您處理多線程和原子訪問器)。

有一點需要注意的是,如果你創建viewDidLoad中(該MutableArray)你應該毀掉它在viewDidUnload(self.locationMeasurements =零;)

+0

非常感謝Joris,我並不是很瞭解我的例子,因爲它與自己「設定」了一次相同的「ivar」或「property」。之後沒有這個「自我」。像這樣或那樣,但在我的代碼中,同樣的「locationMeasurement」正在使用這兩種方式。你能解釋我爲什麼嗎? – Paul

+0

我在回答中添加了一些內容。希望這有助於。 –

+0

謝謝,但仍有一些我不明白:修改伊娃,我們需要一個「二傳手」權利?所以在這裏,我們通過添加一個帶有「addObject」的新項目來修改數組,所以這個ivar將被編輯,但它不會採用「self」。通過二傳手編輯伊娃,它只是「添加對象」直接在伊娃上的一個新項目...沒有「自我」,這是我不明白 – Paul

0

當使用self.你得到所有的@property的好處宣言。這包括內存管理(複製,保存,分配和釋放)和原子性。如果不使用self,並且有一個具有相同名稱的實例變量,則會失去優點,這在分配變量時尤其受到影響。例如,如果locationDetailViewController被宣佈爲copyretain,則您的viewDidUnload例如將導致泄漏,因爲您沒有使用自我。

+0

感謝喬,至於我在之前的回答中的評論,我在問你:我真的不明白使用或不使用自我。在我的例子中,因爲它是與自己「設置」一次的相同的「ivar」或「財產」。之後沒有「自我」。 :我認爲這是一種或另一種方式,但在我的代碼中,同樣的「locationMeasurement」正在使用這兩種方式。你能解釋我嗎?再次感謝 – Paul