@synthesize方法--iOS中成員變量和屬性區別

@synthesize方法--iOS中成員變量和屬性區別

歷史由來:

接觸iOS的人都知道,@property聲明的屬性默認會生成一個_類型的成員變量,同時也會生成setter/getter方法。 但這只是在iOS5之后,蘋果推出的一個新機制??蠢洗a時,經常看到一個大括號里面定義了成員變量,同時用了@property聲明,而且還在@implementation中使用@synthesize方法。 如下:

@interface ViewController ()

{

// 1.聲明成員變量

NSString *myString;

}

// 2.在用@property

@property(nonatomic, copy) NSString *myString;

@end

@implementation ViewController

//3.最后在@implementation中用synthesize生成set方法

@synthesize myString;

@end


其實,發生這種狀況根本原因是蘋果將默認編譯器從GCC轉換為LLVM(low level virtual machine),才不再需要為屬性聲明實例變量了。

在沒有更改之前,屬性的正常寫法需要成員變量+ @property + @synthesize 成員變量三個步驟。 如果我們只寫成員變量+ @property:

@interface GBViewController :UIViewController

{

NSString *myString;

}

@property (nonatomic, strong) NSString *myString;

@end

編譯時會報警告:

Autosynthesized property '?myString' will use synthesized instance variable '_myString', not existing instance variable 'myString'

但更換為LLVM之后,編譯器在編譯過程中發現沒有新的實例變量后,就會生成一個下劃線開頭的實例變量。因此現在我們不必在聲明一個實例變量。(注意:==是不必要,不是不可以==) 當然我們也熟知,@property聲明的屬性不僅僅默認給我們生成一個_類型的成員變量,同時也會生成setter/getter方法。

在.m文件中,編譯器也會自動的生成一個實例變量_myString。那么在.m文件中可以直接的使用_myString實例變量,也可以通過屬性self.myString.都是一樣的。

注意這里的self.myString其實是調用的myString屬性的setter/getter方法。這與C++中點的使用是有區別的,C++中的點可以直接訪問成員變量(也就是實例變量)。

例如在oc中有如下代碼

@interface MyViewController :UIViewController

{

NSString *name;

}

@end

在這段代碼里面只是聲明了一個成員變量,并沒有setter/getter方法。所以訪問成員變量時,可以直接訪問name,也可以像C++一樣用self->name來訪問,但絕對不能用self.name來訪問。

* 擴展:很多人覺得OC中的點語法比較奇怪,實際是OC設計人員有意為之。

* 點表達式(.)看起來與C語言中的結構體訪問以及java語言匯總的對象訪問有點類似,如果點表達式出現在等號 = 左邊,調用該屬性名稱的setter方法。如果點表達式出現在=右邊,調用該屬性名稱的getter方法。

* OC中點表達式(.)其實就是調用對象的setter和getter方法的一種快捷方式,self.myString = @"張三";實際就是[self setmyString:@"張三"];

首先我們要明白,@synthesize 生成了setter/getter方法。 雖然現在直接使用@property時,編譯器會自動為你生成以下劃線開頭的實例變量_myString,不需要自己手動再去寫實例變量。而且也不在.m文件中通過@synthesize myString;生成setter/getter方法。但在看老代碼的時候,我們依舊可以看到有人使用成員變量+ @synthesize 成員變量的形式。

那么問題來了: 我們能否認為新編譯器LLVM下的@property == 老編譯器GCC的 成員變量+ @property + @synthesize 成員變量呢?

答案是否定的。 因為成員變量+ @property + @synthesize 成員變量的形式,編譯器不會幫我們生成_成員變量,因此不會操作_成員變量了; 同時@synthesize 還有一個作用,可以指定與屬性對應的實例變量, 例如@synthesize myString = xxx; 那么self.myString其實是操作的實例變量xxx,而非_String了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文章結構 歷史由來@dynamic與@synthesize的區別 一、歷史由來: 接觸iOS的人都知道,@prop...
    leonardni閱讀 324評論 0 0
  • ——讀書日斷想 文 / 劉東黎 “世間數百年舊家無非積德,天下第一等好事還是讀書。”這是一位清代官員自題的書房楹聯...
    27dd5c406899閱讀 603評論 0 0
  • 本人非技術人員,也非專業測試人員。只是從自己日常使用的角度來對比這幾個筆記類app。(還有就是,既然這是自己選的題...
    大夢齋閱讀 4,457評論 0 3
  • TAG 1 洗漱用品、睡衣拖鞋、DV加電腦;準考證和一本書便是全部;沒有相機、沒有沉重的腳架、更沒有嬌貴煩人的鏡頭...
    Zauberwurst閱讀 511評論 1 1
  • 一句話說出你的目標:和諧有愛,親密的親密關系。 【咖啡冥想】 1今天是周一是種智慧種子的日子。雖然平時參加讀書會的...
    黛兒微笑閱讀 576評論 0 0