OC進(jìn)化簡述

Objective-C 最初起源于 NeXTSTEP 操作系統(tǒng)莱衩,之后喬布斯回到蘋果掺逼,便將它在OS X和iOS中繼承了下來坑赡。
20世紀(jì)80年代初奄妨,Brad BoxTom LoveSmallTalk-80語言為基礎(chǔ)發(fā)明了Objective-C涂籽,Smalltalk是歷史上第二個(gè)面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,也就是說:Objective-C就是C語言面向?qū)ο骃mallTalk語法話的結(jié)果展蒂。
讓我們來看看早起SmallTalk的語法特點(diǎn):

在 Smalltalk 中一切皆對象又活,一切調(diào)用都是發(fā)消息

比如下面的表達(dá)式:

2 + 3

它的意義是:向?qū)ο?code>2發(fā)送消息+,參數(shù)為對象3锰悼。
再比如用一個(gè)工廠方法來實(shí)例化一個(gè)對象:

p := Person name: 'Sai DiCaprio' age: 12

為Person類添加一個(gè)方法

greet: name  
  | message | 
  message := 'Hello ', name. 
  Transcript show: message.

在方法定義里柳骄,管道|包著的本地變量,然后是方法的實(shí)現(xiàn)箕般,把‘Hello’放到了變量message里耐薯,然后用逗號符把它和變量name連接起來。

p := Person new.
p greet: 'Jack'.

這時(shí)Transcript會(huì)輸出 Hello Jack丝里。
從上可以看出曲初,消息傳遞機(jī)制成了C語言進(jìn)化為OC的最大障礙,要實(shí)現(xiàn)向一個(gè)target ( class / instance )發(fā)送消息名selector 動(dòng)態(tài)尋找到函數(shù)實(shí)現(xiàn)地址IMP并調(diào)用杯聚,為了解決這一難題臼婆,需要提供一系列在Build Time無法實(shí)現(xiàn)的運(yùn)行時(shí)函數(shù)支持,這些函數(shù)慢慢封裝完整幌绍,便出現(xiàn)了一套API:Runtime颁褂。

早期的Objective-C = C + Preprocessor + Runtime

既然已經(jīng)形成了一套健全的面向?qū)ο蟮腃語言體系,那么我們來看看早期的Objective-C 代碼是如何書寫的

@interface Person{
  NSString *_name;
  int _age;
}
- (NSString *)name;
- (void)setName:(NSString *)name;

- (int)age;
- (void)setAge:(int)age;
@end

上面的代碼聲明了一個(gè)類Person傀广,他有2個(gè)成員變量颁独,并分別為其提供了setget方法。

秉著誰創(chuàng)建伪冰,誰釋放誓酒;誰引用,誰管理的MRC原則贮聂,在實(shí)現(xiàn)文件中便有了下面的代碼

@implementation Person
- (NSString *)name{
  return _name;
}
- (void)setName:(NSString *)name{
  if (_name != name){
    [_name release];
    _name = [name copy];
  }
  return _name;
}

- (int)age{
  return _age;
}
- (void)setAge:(int)age{
  _age = age;
}

@end

可以看到靠柑,僅僅創(chuàng)建了2個(gè)變量就為類帶來了這么大的代碼量,在成員變量多的情況下寂汇,通篇垃圾代碼病往,于是Objective-C 2.0馬上就出現(xiàn)了新的語法@property關(guān)鍵字
它用來讓編譯器自動(dòng)幫我們生成成員變量和其對應(yīng)的get和set方法的聲明。
比如Person類的聲明中便化為這樣:

@interface Person
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@end

注意:這時(shí)的@property并不像現(xiàn)在一樣會(huì)幫我們自動(dòng)生成成員變量的setter和getter方法的實(shí)現(xiàn)

在實(shí)現(xiàn)方面有另外一個(gè)關(guān)鍵字:@synthesize幫我們根據(jù)屬性修飾符自動(dòng)合成settergetter的實(shí)現(xiàn)骄瓣。

@implementation Person
@synthesize name = _name;
@synthesize age = _age;
@end

后來自動(dòng)合成的@synthesize可以不用寫了停巷,默認(rèn)就是上面的代碼。這樣一來榕栏,整個(gè)類變得輕快了很多畔勤。
但是也會(huì)有這樣的需求:比如不希望系統(tǒng)幫我們自動(dòng)實(shí)現(xiàn)settergetter,而由我們自己來實(shí)現(xiàn)扒磁,便出現(xiàn)了@dynamic關(guān)鍵字庆揪,雖然編譯器會(huì)通過,但是如果在運(yùn)行過程中方法調(diào)用了對應(yīng)的settergetter方法妨托,但是發(fā)現(xiàn)沒有手動(dòng)實(shí)現(xiàn)那么就會(huì)崩潰報(bào)unrecognized selector sent to instance 0x.......的錯(cuò)誤缸榛。編譯時(shí)沒問題吝羞,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法,這就是所謂的動(dòng)態(tài)綁定内颗。

總結(jié):

  • @synthesize 告訴編譯器幫我們合成屬性的getter和setter的實(shí)現(xiàn)
  • @dynamic 告訴編譯器不要幫我自動(dòng)合成屬性钧排,而由我們自己實(shí)現(xiàn)getter和setter的實(shí)現(xiàn)

既然現(xiàn)在的@property會(huì)幫我們自動(dòng)合成autosynthesize那么@dynamic和synthesize如今還有什么意義呢?

回答這個(gè)問題前均澳,我們要搞清楚一個(gè)問題恨溜,什么情況下不會(huì)autosynthesis(自動(dòng)合成)?

  • 同時(shí)重寫了 setter 和 getter 時(shí)
  • 重寫了只讀屬性的 getter 時(shí)
  • 使用了 @dynamic 時(shí)
  • 在 @protocol 中定義的所有屬性
  • 在 category 中定義的所有屬性
  • 重載的屬性

當(dāng)同時(shí)重寫了setter和getter或者重寫了只讀屬性的getter時(shí)找前,系統(tǒng)就不會(huì)幫我們自動(dòng)合成糟袁,就意味著ivar也不會(huì)被生成,所以躺盛,這種情況下有兩種方案:

  • 自己添加ivar
  • 使用@synthesize

也就是說项戴,當(dāng)你想手動(dòng)管理 @property 的所有內(nèi)容時(shí),你就會(huì)嘗試通過實(shí)@property 的所有存取方法或者使用@dynamic來達(dá)到這個(gè)目的槽惫,這時(shí)編譯器就會(huì)認(rèn)為你打算手動(dòng)管理 @property肯尺,于是編譯器就禁用了自動(dòng)合成。

另外躯枢,當(dāng)你在子類中重載了父類中的屬性则吟,你必須 使用 @synthesize 來手動(dòng)合成ivar。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锄蹂,一起剝皮案震驚了整個(gè)濱河市氓仲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌得糜,老刑警劉巖敬扛,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朝抖,居然都是意外死亡啥箭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門治宣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來急侥,“玉大人,你說我怎么就攤上這事侮邀』倒郑” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵绊茧,是天一觀的道長铝宵。 經(jīng)常有香客問我,道長华畏,這世上最難降的妖魔是什么鹏秋? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任尊蚁,我火速辦了婚禮,結(jié)果婚禮上侣夷,老公的妹妹穿的比我還像新娘枝誊。我一直安慰自己,他們只是感情好惜纸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绝骚,像睡著了一般耐版。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上压汪,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天粪牲,我揣著相機(jī)與錄音,去河邊找鬼止剖。 笑死腺阳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穿香。 我是一名探鬼主播亭引,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皮获!你這毒婦竟也來了焙蚓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤洒宝,失蹤者是張志新(化名)和其女友劉穎购公,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雁歌,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宏浩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靠瞎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比庄。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乏盐,靈堂內(nèi)的尸體忽然破棺而出印蔗,到底是詐尸還是另有隱情,我是刑警寧澤丑勤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布华嘹,位于F島的核電站,受9級特大地震影響法竞,放射性物質(zhì)發(fā)生泄漏耙厚。R本人自食惡果不足惜强挫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薛躬。 院中可真熱鬧俯渤,春花似錦、人聲如沸型宝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趴酣。三九已至梨树,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岖寞,已是汗流浹背抡四。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仗谆,地道東北人指巡。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像隶垮,于是被迫代替她去往敵國和親藻雪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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

  • 在這個(gè)信息無限發(fā)達(dá)的時(shí)代里狸吞,聯(lián)系一個(gè)人很容易阔涉,失去一個(gè)人,夜同樣容易捷绒。 你的生命里一定也出現(xiàn)過這樣的人瑰排,當(dāng)年你們是...
    十四條小魚閱讀 450評論 0 1
  • 摘錄自第四季《奇葩說》關(guān)于該不該把父母送到養(yǎng)老院?馬微微的闡述 你們覺得什么樣的人才會(huì)結(jié)婚生子暖侨,然...
    樓尚青閱讀 232評論 0 0
  • 今年春節(jié)椭住,我沒有讓自己沉浸在這種氣氛中,也許是脫離了這個(gè)慣性了吧字逗,自己也會(huì)有點(diǎn)不適應(yīng)京郑,因?yàn)槲铱梢圆辉偈苓@些大...
    Sim2閱讀 255評論 2 0
  • 【出發(fā)】 A是一個(gè)對未來充滿想象,但對未知的生活又有些顧慮的女孩葫掉。大學(xué)畢業(yè)前些举,考取了在當(dāng)年是全國通過率10%的專業(yè)...
    熊小朱閱讀 250評論 3 0