2010-09-19 119 views
0

我知道你使用@synthesize創建setter和getter方法,這使得更容易的事情,因爲你沒有寫自己的。setter和getter方法

有些情況下,你必須使用self.property,而不只是財產爲了使用的setter和getter方法,如在dealloc中和的initWithCoder某些地方。

這告訴我,這些setter和getter方法做其他事情的這一點很重要,除了讓您更容易設置和獲取變量。他們在做什麼,他們如何做?

回答

5

他們在做什麼,你告訴他們在@property語句或您自己的實現的事,如果你選擇了寫一個。大多數情況下,使用訪問器而不是直接修改實例變量的原因是爲了避免內存泄漏。想象一下,

@property (nonatomic, retain) NSString *myString; 
@synthesize myString; 

聲明的NSString實例變量這些線產生,當你想改變一個對象的myString屬性,正確地調用releaseretain的訪問。如果你沒有調用訪問器,你可能會泄漏舊的值,除非你自己仔細地進行內存管理。

3

您的基本信條:

有一些地方,你必須使用self.property代替 只是財產,以充分利用的setter和getter方法,如 在dealloc中和的initWithCoder 。

這告訴我,這些setter和getter方法正在做的事情 否則這很重要......

是不太正確的。這裏的區別在於使用self.propertyname在該類中使用時專門調用getter/setter,其中直接使用propertyname不會 - 它直接訪問實例變量。

每@Carl好的做法是,您使用的getter/setter序列無處不在,你絕對可以,因爲這讓你非常缺少從內存管理的一個角落情況下是安全的。

2

我第二什麼@ heckj和@Carl說,但必須添加一個點。

一般安全在任何initdealloc使用存取。問題是你的課程可能會被分類,訪問者可能會被覆蓋。然後這些訪問器可能會訪問您的類或子類的其他屬性。這可能會導致死機:

  • 在這些尚未初始化(因爲在init你做的第一個電話是[super init])的init的情況。
  • dealloc這些情況都已經被釋放(因爲在dealloc你做的最後一次通話是[super dealloc])。

在實踐可能使用存取在initdealloc。在兩個前提下:

  • 你知道你在做什麼。 (見上)
  • 你控制所有可能的繼承代碼。 (不適用於框架等)