使用setter方法和 號進行屬性賦值的區別

2021-06-08 16:54:56 字數 1549 閱讀 3757

如果你不使用arc,那麼使用setter方法和=號對屬性進行賦值是不同的。

使用=號賦值,屬性不會被retain。 比如:bodytext

=s;

如果bodytext宣告為retain,則你應當自己retain它:

bodytext

=[s retain];

當然,在dealloc方法中,你需要release它避免可能的記憶體洩露:

[bodytext

release];

但當你使用setter方法賦值時,並不需要呼叫retain,例如:[self setbodytext

:s];

這是因為bodytext屬性已經宣告為retain,當你對bodytext屬性使用@synthesize語句時,所合成的setter方法中會自動加入適當的retain語句。例如synthesize後的setbodytext:方法很可能是這樣的:

bodytext=[string

retain];

當然,如果setter方法不是synthesize而是你自定義的,則你應該在setter方法中自己retain。否則,你很可能會收到 message sent to deallocated instance錯誤。

另外,使用.語句對屬性賦值,等同於使用setter方法對屬性進行賦值,如self.bodytext=s;一句,就等同於[self setbodytext:s] 。

另外,我們在類方法中需要注意兩種屬性引用的區別,比如:bodytext和self.bodytext。

當我們使用@property語句@property

(retain

,nonatomic

)nsstring

* bodytext;宣告屬性時,實際上sdk會自動為我們宣告乙個與屬性同名的成員變數:nsstring* bodytext。

當synthesize之後,我們讀取bodytext屬性時,會呼叫 getter方法bodytext,這個getter方法會return這個同名的成員變數。

當對bodytext屬性賦值時,會呼叫setter方法setbodytext,在這個setter方法中,會對成員變數bodytext進行賦值。

因此,在訪問bodytext屬性時,你可以通過self.bodytext來訪問,也可以直接訪問成員bodytext。這樣,下列語句實際上等效的:

s=self.bodytext; 和 s=bodytext;

[bodytext release]; 和 [self.bodytextrelease];

只是在賦值時有所不同,因為bodytext=s;實際上只是對成員bodytext進行了賦值操作。而self.bodytext=s;則很可能在賦值的同時進行了retain操作。因為後者呼叫了setter方法。

預設情況下,sdk自動新增的成員名會和屬性名同名。你也可以自己指定與屬性對應的成員變數名,這需要在syntheszie語句中進行,如:

@syntheszie bodytext=_bodytext;

其中,我們把屬性bodytext的自動成員命名為_bodytext。你可以在類方法中通過成員_bodytext來操控物件的bodytext屬性。

使用setter方法和 號進行屬性賦值的區別

如果你不使用arc,那麼使用setter方法和 號對屬性進行賦值是不同的。使用 號賦值,屬性不會被retain。比如 bodytext s 如果bodytext宣告為retain,則你應當自己retain它 bodytext s retain 當然,在dealloc方法中,你需要release它避免...

setter方法和getter方法

oc是一門物件導向的語言,物件導向的語言有三大特性,就是封裝性,繼承性和多型性.類的資料與功能的封裝,資料就是成員變數,功能就是類方法或者物件方法,對資料的封裝,也就是對成員變數的封裝,封裝就是把資料隱藏起來,只能用此類的方法才可以讀取或者設定資料,不可被外部任意修改是物件導向設計本質,降低了資料被...

有關getter 和 setter的使用

getter 讀取物件屬性時將被呼叫的函式。setter 設定物件屬性時被呼叫的函式。有以下4中方式可以使用 setter 和 getter 使用get set關鍵字為屬性新增乙個函式,函式名即為屬性名,get函式不傳參,set函式傳入的引數為設定物件的新值。例如 var person set na...