用__Attribute__做點好玩的事情:第一篇

之前寫過一篇attribute((constructor))用法探究,當時是在看代碼的時候,對它產(chǎn)生了偶遇.而這幾天,越發(fā)發(fā)現(xiàn)這個__attribute__的強大.作為一個iOS開發(fā)者,我試著總結(jié)了一下這個在我們?nèi)粘i_發(fā)中的應(yīng)用.

從 __Nonull說起

蘋果在Xcode6.3中引入了這個特性, 目的在于為Swift混編時,讓編譯器知道這個Object-C對象是不是可選的.使用方法如下:

-(void)openPath:(NSString * _Nonnull)path;

今天在llvm的文檔中,發(fā)現(xiàn)了一段這樣的描述:


The nonnull attribute indicates that some function parameters must not be null, and can be used in several different ways. It’s original usage (from GCC) is as a function (or Objective-C method) attribute that specifies which parameters of the function are nonnull in a comma-separated list. 

大概意思是:
nonnull這個屬性表示函數(shù)的參數(shù)不能為空,并且這個屬性有幾種不同的使用方式,最基本的用法就是用來修飾函數(shù)(或者OC的方法),使用一個用逗號分隔的參數(shù)表來表明函數(shù)或者方法的那個哪個參數(shù)非空.

還是代碼比較明顯:

-(void)openFile:(NSString*)file __attribute__((nonnull(1)));

當我們這么使用時候:

 [self openFile:nil];

就會得到這么一個警告:


20160928147504628663285.jpg

幾個注意點:

  • nonull的參數(shù)從1開始
  • OC的隱含參數(shù)self_cmd不計入?yún)?shù)范圍

_Nonnull_Nullable在文檔中也有說明:

_Nonnull修飾指針類型,表示這個指針類型不會把null當做有意義的參數(shù),用法如下:

int fetch(int * _Nonnull ptr);

_Nullable修飾指針類型,表示這個指針類型可以是null的,用法如下:

int fetch_or_zero(int * _Nullable ptr);

注意:它們只能修飾指針類型的參數(shù).

RAC中的 @onExit

用過RAC的應(yīng)該對這個關(guān)鍵字不陌生,它實現(xiàn)了,當一個變量作用域結(jié)束時,調(diào)用指定的block,查看這個宏的定義:

#define onExit \
    rac_keywordify \
    __strong rac_cleanupBlock_t metamacro_concat(rac_exitBlock_, __LINE__) __attribute__((cleanup(rac_executeCleanupBlock), unused)) = ^

這個rac_keywordfiy的定義如下:

#if DEBUG
#define rac_keywordify autoreleasepool {}
#else
#define rac_keywordify try {} @catch (...) {}
#endif

這也是為什么onExit使用的時候,前面需要添加一個@,因為只有這樣才能湊成完整的@autoreleasepool或者@try {}.
言歸正傳,我們關(guān)注這個部分:

__attribute__((cleanup(rac_executeCleanupBlock), unused))

先說簡單的,unused表示函數(shù)或者變量可能不用,防止編譯器產(chǎn)生警告.
而這個__attribute__((cleanup(...)))用來修飾變量,當變量的作用域結(jié)束的時候,就調(diào)用參數(shù).參數(shù)是一個函數(shù),當然,也可以是block,RAC里面就是這么干的.用代碼來說明:

static void stringCleanUp(__strong NSString **string) {
    NSLog(@"%@", *string);
}

static void cleanupBlock(__strong void(^*block)(void)) {
    (*block)();
};

- (void)viewDidLoad {
    [super viewDidLoad];

    __strong NSString * myname  __attribute__((cleanup(stringCleanUp), unused)) = @"kenny";
    
    __strong void(^block)(void) __attribute__((cleanup(cleanupBlock), unused)) = ^{
        NSLog(@"gonna released");
    };
}

需要注意的是cleanup的參數(shù)方法:它的參數(shù)是修飾的變量的地址.所以會用到了*block**string,另外:

對于指向objc對象的指針(id *)落蝙,如果不強制聲明__strong默認是__autoreleasing泉懦,造成類型不匹配

參考鏈接:

Common-Variable-Attributes

http://blog.sunnyxx.com/2014/09/15/objc-attribute-cleanup/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末立帖,一起剝皮案震驚了整個濱河市趁矾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異账蓉,居然都是意外死亡,警方通過查閱死者的電腦和手機逾一,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門铸本,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遵堵,你說我怎么就攤上這事箱玷。” “怎么了陌宿?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵锡足,是天一觀的道長。 經(jīng)常有香客問我壳坪,道長舶得,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任爽蝴,我火速辦了婚禮沐批,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝎亚。我一直安慰自己九孩,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布发框。 她就那樣靜靜地躺著躺彬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宪拥,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天仿野,我揣著相機與錄音,去河邊找鬼江解。 笑死,一個胖子當著我的面吹牛徙歼,可吹牛的內(nèi)容都是我干的犁河。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼魄梯,長吁一口氣:“原來是場噩夢啊……” “哼桨螺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酿秸,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤灭翔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辣苏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肝箱,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年稀蟋,在試婚紗的時候發(fā)現(xiàn)自己被綠了煌张。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡退客,死狀恐怖骏融,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萌狂,我是刑警寧澤档玻,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站茫藏,受9級特大地震影響误趴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜务傲,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一冤留、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧树灶,春花似錦纤怒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春烘豹,著一層夾襖步出監(jiān)牢的瞬間瓜贾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工携悯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祭芦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓憔鬼,卻偏偏與公主長得像龟劲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轴或,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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

  • 一昌跌、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,822評論 0 27
  • attribute是GNU C特色之一,在iOS用的比較廣泛.系統(tǒng)中有許多地方使用到. attribute可以設(shè)置...
    youngyunxing閱讀 28,419評論 7 66
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,629評論 1 19
  • 一曲俗人言照雁,兩抹閑人淚蚕愤, 酒肉穿腸過,觥倒知不知饺蚊? 挽袖濕衣萍诱,行云流水, 俯仰之間污呼,仕女石上砂沛。 遠眺目下,塵起拂光...
    音驪繪閱讀 285評論 1 1
  • 2016年元月2日曙求,在這冬日里走在這鹿城的小巷里碍庵,在時光飛逝咖啡館里欣賞著這話劇--《暗戀桃花源》,這場景這人...
    時間yi閱讀 781評論 1 1