1. 程式人生 > >iOS中property和synthesize的詳細說明

iOS中property和synthesize的詳細說明

我們要在一個類中定義屬性,首先是要在.h檔案中(或者說是在.m檔案中的@interface的作用域中)使用關鍵字property來進行屬性的宣告,同時,在xcode的4.5版本以前,如果我們想要直接用屬性名前面加上下劃線構成的變數來進行操作的話,需要在.m檔案中寫上@synthesize student = _student(這裡就用student代表一個屬性),這樣才能編譯通過,成功使用_student這個變數來對屬性進行操作。

1、對於property,可能是再熟悉不過的了,當我們需要定義宣告一個屬性的時候就要用到它。但是,讓我們回想到一個最原始的類的建立,在objective-c中,類在預設情況下是protected的,也就是說,只有本類或者是有繼承關係的淚才能夠拿到這個類的屬性進行操作,那麼,如果其他類想要操作這些屬性就沒有辦法了。所以,如果我們需要這樣的操作,那麼就要在這個類裡面為屬性寫上setter和getter方法,來為其他類提供一個類似於介面的東西來操作本類的屬性,所以,最原始的類裡面應該是這樣寫的:
@interface Student : NSObject  
{  
//age和gender這兩個屬性的宣告
    int age;  
    int gender;  
}  
//age的getter和setter方法宣告  
- (int)age;  
- (void)setAge:(int)newAge;  
//no的getter和setter方法宣告  
- (int)gender;  
- (void)setGender:(int)newGender;  
@end  
但是,如果試想,一個類有100個屬性,那麼我們就得寫100個getter和100個setter方法,那樣的話,類裡面的內容就會很龐大雜亂,所以,property的出現正是為了解決這個問題,相信大家也都理解到了property的作用,那就是用property宣告的屬性會自動去宣告setter方法和getter方法,不用我們去手動書寫。同時,也可以發現,使用property定義的屬性,都可以為屬性定義一些說明性的引數,比如我們常用的nonatomic,copy,assign等等。
2、接著是synthesize,大家最熟悉的應該是這兩種寫法(這裡使用student代表任意一個屬性)@synthesize student; 以及 @synthesize student = _student 其實,第一個寫法等價於 @synthesize student = student,提完了這點,相信大家也都有所明白,有些開發者喜歡直接使用下劃線加上屬性名來進行操作,有些開發者喜歡使用self.student這種形式來書寫,在ARC的機制下兩者表面上的差別不是很大,但是有一點需要我們去理解清楚的是(這裡說明的情況是xcode4.5以後的版本)synthesize的作用就是讓student = ?中的後者這個變數來“代替”屬性,從而可以通過操作變數來進行屬性的操作,但是有一點最關鍵的是,使用變數進行操作,屬性本身的引用計數是不會增加的,因為沒有經過呼叫setter方法或者是getter方法。但是如果使用self.student這種操作方式的話,實質上是通過setter或者是getter方法進行操作,引用計數會隨著不同的操作而改變,瞭解了這點後就能夠更好的避免記憶體洩露問題。另外,synthesize會自動地生成setter方法和getter方法的實現。通過這些瞭解,我們知道了使用property和synthesize確實大大優化了我們的程式碼,讓我們的程式碼看起來更加精簡。