iOS __attribute__

iOS __attribute__

最近在逛博客的過程中看到__attribute__的例子,就整理了一下,自己動手嘗試了幾個比較常用的。

對于__attribute__網上是這么解釋的:

Clang Attributes是Clang提供的一種源碼注解,方便開發(fā)者向編譯器表達某種要求,參與控制如Static Analyzer、Name Mangling、Code Generation等過程,一般以attribute(xxx)的形式出現在代碼中;為方便使用,一些常用屬性也被Cocoa定義成宏,比如在系統頭文件中經常出現的NS_CLASS_AVAILABLE_IOS(9_0)就是attribute(availability(...))這個屬性的簡單寫法。


下面來看例子

1 __attribute__((objc_subclassing_restricted))

restricted是受限制的意思,表示這個類不能被繼承,它修飾在一個類的頭文件中

我寫了一個類表示狗,一個表示貓,繼承的時候就會報錯

2?__attribute__((objc_requires_super))

這個修飾在方法之后,表示子類重寫這個方法須調用父類的方法,否則會給警告,我們用小狗來演示

我們可以看到調用super后警告就會消失

3__attribute__((objc_runtime_name("wolf")))

這個表示可以修改一個類的isa指針,用于?@interface?或?@protocol,將類或協議的名字在編譯時指定成另一個,代碼混淆用它再好不過了

我們對ClangAttributeCat類做了標記,可以看到在運行時類的名字做了改變

4?__attribute__((deprecated("str")))

方法警告提示,修飾在方法或屬性的后面,在調用的時候會給出警告提示,str是我們警告的內容

例子很簡單不多說

5?NS_UNAVAILABLE

禁止使用標識,也是修士在屬性和方法的后面,標識禁止使用。

NS_UNAVAILABLE是一個宏定義,點擊進入后可以看見

#define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE

UNAVAILABLE_ATTRIBUTE也是一個宏定義,我們可以直接使用兩個作用是一樣的,進入宏定義后我們又會發(fā)現

#define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable))

最終還是用的__attribute__((unavailable)),所以例子也很簡單,unavailable后面可以加提示。

6?__attribute__((constructor))/__attribute__((destructor))

構造解析器,修飾的方法可以再main方法前后分別運行,注意的是constructor 和?+load?都是在 main 函數執(zhí)行前調用,但?+load?比 constructor 更加早一點,因為 dyld(動態(tài)鏈接器,程序的最初起點)在加載 image(可以理解成 Mach-O 文件)時會先通知?objc runtime?去加載其中所有的類,每加載一個類時,它的?+load?隨之調用,全部加載完成后,dyld 才會調用這個 image 中所有的 constructor 方法。

構造器修飾的方法不一定要寫在main的文件里,也可以在其他的文件里。

修飾的方法不一定是一個,也可以多個。

我們可以看到運行結果load->beforeMain->main->afterMain,在上面的main方法里我把autoreleasepool里面的都注釋掉了,是因為它會啟動runloop循環(huán),導致main方法不能運行完畢,afterMain就不能運行,這里為了演示所以注釋掉,所以開發(fā)中__attribute__((destructor))用不到。

7?__attribute__ enable_if

參數靜態(tài)檢查,這個屬性只能用在 C 函數上,修士在方法后面,檢查參數是否正確,錯誤會編譯不通過。

對于這個我還是有點疑惑,enable_if后面的字符串我一直沒搞明白是干什么的,這里就填空字符串吧。

8?__attribute__((overloadable))

用于C函數,修飾同名不同參數的方法,可以同時存在,調用時只需傳遞不同的參數

調用:

overLoad("helloworld");

overLoad(10);

overLoad(YES);

9?__attribute__((cleanup()))

聲明棧中的一個變量,當變量的作用域結束后,調用cleanup里的方法。

這里我們來定義三個變量NSString,int,block

在結尾的輸出中,順序是按照block->int->NSString的順序,這也符合棧后進先出的原則。

10 __attribute__((NSObject))

參照網上的說法會把一個非OC對象的內存管理,當做OC對象來管理。如果沒看懂我們來看例子

看第14行我們用typedef重新定義了CFDictionaryRef,在這里為了體現內存管理,我們寫了兩個屬性cfDictionaryStrong、cfDictionaryWeak,分別用strong、weak修飾。

如果按照正常的邏輯在viewDidLoad里面設值,cfDictionaryStrong會保留。

如上圖,在viewDidLoad里設值,點擊的時候打印,我們看到cfDictionaryStrong打印出結果,cfDictionaryWeak為空。

11?__attribute__((nonnull))

這個修飾在方法的后面,表示方法的參數不能為nil,如果調用參數為nil會發(fā)出警告,太簡單了不寫例子了。

最后筆者第一次寫簡書,希望大家多多支持-.-

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374