@synthesize到底干了什么

一:屬性

@property = ivar + getter + setter;

編譯器會自動寫出一套存取方法活孩,用以訪問給定類型中具有給定名稱的變量。 所以你也可以這么說:

@property = getter + setter;

例如下面這個類:

@interface?Person?:?NSObject

@property?NSString?*firstName;

@property?NSString?*lastName;

@end

上述代碼寫出來的類與下面這種寫法等效:

@interface?Person?:?NSObject

-?(NSString?*)firstName;

-?(void)setFirstName:(NSString?*)firstName;

-?(NSString?*)lastName;

-?(void)setLastName:(NSString?*)lastName;

@end

完成屬性定義后,編譯器會自動編寫訪問這些屬性所需的方法良瞧,此過程叫做“自動合成”( autosynthesis)。需要強調(diào)的是,這個過程由編譯 器在編譯期執(zhí)行蹋偏,所以編輯器里看不到這些“合成方法”(synthesized method)的源代碼扮匠。除了生成方法代碼 getter肋殴、setter 之外枫弟,編譯器還要自動向類中添加適當類型的實例變量客燕,并且在屬性名前面加下劃線闺鲸,以此作為實例變量的名字澳骤。在前例中醋闭,會生成兩個實例變量鲤看,其名稱分別為 _firstName與_lastName。也可以在類的實現(xiàn)代碼里通過 @synthesize語法來指定實例變量的名字.

@implementation?Person

@synthesize?firstName?=?_myFirstName;

@synthesize?lastName?=?myLastName;

@end

@property有兩個對應的詞葫掉,一個是@synthesize些举,一個是@dynamic。如果@synthesize和@dynamic都沒寫俭厚,那么默認的就是@syntheszie var = _var;

@synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法户魏,那么編譯器會自動為你加上這兩個方法。

@dynamic告訴編譯器:屬性的setter與getter方法由用戶自己實現(xiàn)挪挤,不自動生成叼丑。(當然對于readonly的屬性只需提供getter即可)。假如一個屬性被聲明為@dynamic var扛门,然后你沒有提供@setter方法和@getter方法鸠信,編譯的時候沒問題,但是當程序運行到instance.var = someVar论寨,由于缺setter方法會導致程序崩潰星立;或者當運行到 someVar = var時,由于缺getter方法同樣會導致崩潰葬凳。編譯時沒問題绰垂,運行時才執(zhí)行相應的方法,這就是所謂的動態(tài)綁定火焰。

總結(jié)下@synthesize合成實例變量的規(guī)則劲装,有以下幾點:

1)如果指定了成員變量的名稱,會生成一個指定的名稱的成員變量,

2)如果這個成員已經(jīng)存在了就不再生成了.

3)如果是 @synthesize foo; 還會生成一個名稱為foo的成員變量,也就是說:如果沒有指定成員變量的名稱會自動生成一個屬性同名的成員變量昌简。

4)如果是 @synthesize foo = _foo; 就不會生成成員變量了.

假如property名為foo占业,存在一個名為_foo的實例變量,那么還會自動合成新變量么纯赎? 不會谦疾。

我們要搞清楚一個問題,什么情況下不會autosynthesis(自動合成)犬金?

同時重寫了setter和getter時

重寫了只讀屬性的getter時

使用了@dynamic時

在 @protocol 中定義的所有屬性

在 category 中定義的所有屬性

重載的屬性

當你在子類中重載了父類中的屬性餐蔬,你必須 使用@synthesize來手動合成ivar。

除了后三條佑附,對其他幾個我們可以總結(jié)出一個規(guī)律:當你想手動管理@property的所有內(nèi)容時樊诺,你就會嘗試通過實現(xiàn)@property的所有“存取方法”(the accessor methods)或者使用@dynamic來達到這個目的,這時編譯器就會認為你打算手動管理@property音同,于是編譯器就禁用了autosynthesis(自動合成)词爬。

因為有了autosynthesis(自動合成),大部分開發(fā)者已經(jīng)習慣不去手動定義ivar权均,而是依賴于autosynthesis(自動合成)顿膨,但是一旦你需要使用ivar锅锨,而autosynthesis(自動合成)又失效了,如果不去手動定義ivar恋沃,那么你就得借助@synthesize來手動合成ivar必搞。

其實,@synthesize語法還有一個應用場景囊咏,但是不太建議大家使用:

可以在類的實現(xiàn)代碼里通過@synthesize語法來指定實例變量的名字:

@implementation?CYLPerson

@synthesize?firstName?=?_myFirstName;

@synthesize?lastName?=?_myLastName;

@end

上述語法會將生成的實例變量命名為_myFirstName與_myLastName恕洲,而不再使用默認的名字。一般情況下無須修改默認的實例變量名梅割,但是如果你不喜歡以下劃線來命名實例變量霜第,那么可以用這個辦法將其改為自己想要的名字。筆者還是推薦使用默認的命名案户辞,因為如果所有人都堅持這套方案泌类,那么寫出來的代碼大家都能看得懂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末底燎,一起剝皮案震驚了整個濱河市刃榨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌双仍,老刑警劉巖喇澡,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殊校,居然都是意外死亡,警方通過查閱死者的電腦和手機读存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門为流,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人让簿,你說我怎么就攤上這事敬察。” “怎么了尔当?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵莲祸,是天一觀的道長。 經(jīng)常有香客問我椭迎,道長锐帜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任畜号,我火速辦了婚禮缴阎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘简软。我一直安慰自己蛮拔,他們只是感情好述暂,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著建炫,像睡著了一般畦韭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肛跌,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天艺配,我揣著相機與錄音,去河邊找鬼惋砂。 笑死妒挎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的西饵。 我是一名探鬼主播酝掩,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眷柔!你這毒婦竟也來了期虾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤驯嘱,失蹤者是張志新(化名)和其女友劉穎镶苞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞠评,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡茂蚓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剃幌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聋涨。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖负乡,靈堂內(nèi)的尸體忽然破棺而出牍白,到底是詐尸還是另有隱情,我是刑警寧澤抖棘,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布茂腥,位于F島的核電站,受9級特大地震影響切省,放射性物質(zhì)發(fā)生泄漏最岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一朝捆、第九天 我趴在偏房一處隱蔽的房頂上張望仑性。 院中可真熱鬧,春花似錦、人聲如沸诊杆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晨汹。三九已至豹储,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淘这,已是汗流浹背剥扣。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铝穷,地道東北人钠怯。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像曙聂,于是被迫代替她去往敵國和親晦炊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容