__attribute__機(jī)制是GNU C的一大特色,增強(qiáng)編譯器的功能,帶來更多的檢查,更多的優(yōu)化??梢栽O(shè)置函數(shù)特性,變量特性,類型特性,標(biāo)簽特性,枚舉特性,語法格式是__attribute__((attributes))。不同的編譯器在細(xì)節(jié)上會(huì)有差別,持有的特性也不盡相同。下面介紹幾種Objective-C中可以使用的特性。
__attribute__((deprecated))
可以用來修飾變量,方法,類和協(xié)議,表明被廢棄,如果使用,編譯器會(huì)發(fā)出警告。可以添加說明,用法__attribute__((deprecated("use Another class.")))。__attribute__((unavailable))
可以用來修飾變量,方法,類和協(xié)議,表明不可用,如果使用,編譯器會(huì)發(fā)出錯(cuò)誤。同deprecated,可以添加說明。__attribute__((NSObject))
用來修飾屬性,表明Core Fundation類型的屬性應(yīng)該按照Objective-C的對(duì)象來進(jìn)行內(nèi)存管理。比如 @property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;__attribute__((objc_designated_initializer))
用來修飾類的designated initializer初始化方法,如果修飾的方法里沒有調(diào)用超類的 designated initializer,編譯器會(huì)發(fā)出警告。可以簡寫成NS_DESIGNATED_INITIALIZER。__attribute__((constructor))
用來修飾函數(shù),函數(shù)的返回值為void,參數(shù)為void,會(huì)在main函數(shù)開始之前調(diào)用??梢灾付▋?yōu)先級(jí)(大于100,0到100為系統(tǒng)保留),多個(gè)修飾的函數(shù),按照優(yōu)先級(jí)高低順序執(zhí)行。__attribute__((destructor))
用來修飾函數(shù),返回值和參數(shù)同constructor,會(huì)在main函數(shù)結(jié)束之后調(diào)用。優(yōu)先級(jí)同constructor。
deprecated、unavailable、NSObject、objc_designated_initializer應(yīng)該涵蓋了大部分的應(yīng)用場景,constructor/destructor 目前只在libextobjc中見到運(yùn)用,在main函數(shù)之前可以干很多黑魔法的事。
更多__attribute__介紹,可以參考 http://blog.sunnyxx.com/2016/05/14/clang-attributes/