說說 Objective-C 里的 @()

Intro

在 Objective-C 中我們可以用 @"foo" 來創(chuàng)建一個 NSString 常量奖恰,看起來似乎平淡無奇够颠。

但它背后其實比想象的精彩橱赠,@ 可以被理解成一個特殊的宏,其接受一個 C 字符串作為參數(shù)超凳,也可寫作 @("foo")钞澳。

之所以說 @ 是一個特殊的宏怠惶,是因為其能根據(jù)傳入的 C 字符串類型不同——C 字符串常量或 C 字符串——在運行時構(gòu)建返回不同類型的 NSString,參見下面的代碼:

```

char* obtain_c_string(void)

{

return"c_string";

}

NSLog(@"%@",?@"foo".class);

NSLog(@"%@",?@("bar").class);

NSLog(@"%@",?@(obtain_c_string()).class);

```

輸出結(jié)果如下:

```

2016-06-05?01:14:15.097?Sandbox[45804:c07]?__NSCFConstantString

2016-06-05?01:14:15.098?Sandbox[45804:c07]?__NSCFConstantString

2016-06-05?01:14:15.098?Sandbox[45804:c07]?__NSCFString

```

可見轧粟,如果傳入的是 C 字符串常量策治,運行時構(gòu)建的則為 NSConstantString;如果傳入的是 C 字符串則創(chuàng)建的是 NSString兰吟。

Then?

你可能會問這么理解了又怎樣通惫?

眾所周知,Objective-C 代碼里有很多地方需要我們把代碼中的一些文法串寫成字符串再作為傳入?yún)?shù)混蔼,比如 KVO 中的 keyPath 參數(shù)往往就要傳入形如 propertyA.propertyB 的字符串讽膏,從實用角度出發(fā)這有兩個弊端:

寫字符串的時候沒有代碼提示,很容易寫錯

即便一開始寫對了拄丰,如果后來相關(guān)類重構(gòu)了府树,keyPath 的參數(shù)便失效了,而 Xcode Refactor 無法掃描字符串

當(dāng)我們理解了 @()料按,再加上自定義的宏奄侠,上述兩個問題便可迎刃而解。

```

/**

*?#?將宏的參數(shù)字符串化载矿,C?函數(shù)?strchr?返回字符串中第一個?'.'?字符的位置

*/

#define?Keypath(keypath)?(strchr(#keypath,?'.')?+?1)

[objA?addObserver:objB

forKeyPath:@Keypath(ObjA.property1.property2)//?有代碼提示垄潮,可以被重構(gòu)掃描到

options:nil

context:nil];

```

這個簡單實現(xiàn)只算是拋磚引玉,除了 @() 配合自定義宏來字符串化代碼中的文法串闷盔,更多的用法就有待在開發(fā)中不斷發(fā)掘了弯洗。

PS: 在即將完成這篇文章的時候我發(fā)現(xiàn)已有國外開發(fā)者利用 @() 特性配合自定義宏,全面系統(tǒng)的解決了上述問題逢勾,詳情參見libextobjc/EXTKeyPathCoding.h牡整。

Extra

此外,@() 還可以接受 int 字面量或 int 變量作為參數(shù)溺拱,比如:

NSString*str=@"hello";

NSLog(@"%@",@(str.length).class);

輸出結(jié)果如下:

2016-08-29 11:26:45.282 testDemo[912:45502] __NSCFNumber

有興趣的讀者可以自行感受下逃贝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迫摔,隨后出現(xiàn)的幾起案子沐扳,更是在濱河造成了極大的恐慌,老刑警劉巖句占,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沪摄,死亡現(xiàn)場離奇詭異,居然都是意外死亡纱烘,警方通過查閱死者的電腦和手機(jī)杨拐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凹炸,“玉大人戏阅,你說我怎么就攤上這事∑∷” “怎么了奕筐?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長变骡。 經(jīng)常有香客問我离赫,道長,這世上最難降的妖魔是什么塌碌? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任渊胸,我火速辦了婚禮,結(jié)果婚禮上台妆,老公的妹妹穿的比我還像新娘翎猛。我一直安慰自己胖翰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布切厘。 她就那樣靜靜地躺著萨咳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疫稿。 梳的紋絲不亂的頭發(fā)上培他,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音遗座,去河邊找鬼舀凛。 笑死,一個胖子當(dāng)著我的面吹牛途蒋,可吹牛的內(nèi)容都是我干的猛遍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼碎绎,長吁一口氣:“原來是場噩夢啊……” “哼螃壤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筋帖,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤奸晴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后日麸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寄啼,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年代箭,在試婚紗的時候發(fā)現(xiàn)自己被綠了墩划。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗡综,死狀恐怖乙帮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情极景,我是刑警寧澤察净,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站盼樟,受9級特大地震影響氢卡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晨缴,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一译秦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦筑悴、人聲如沸们拙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睛竣。三九已至,卻和暖如春求摇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殊者。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工与境, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猖吴。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓摔刁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親海蔽。 傳聞我的和親對象是個殘疾皇子共屈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理党窜。運行時機(jī)制的原理和運用場景拗引。SDWebImage的原...
    LZM輪回閱讀 2,004評論 0 12
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,712評論 0 4
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,345評論 0 35
  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,249評論 0 10
  • 得失方看淡,人生無所需幌衣。 花落何處去矾削,水流江河里。 他喜任他喜豁护,我悲我無意哼凯。 繁華曾落去,逍遙入野去楚里。 秋來葉歸地...
    夢怡峒閱讀 200評論 0 0