資料介紹
Variable Attributes 其實(shí)是 GCC 中用于描述變量的一種修飾符。我們可以使用 __attribute__ 來(lái)修飾一些變量來(lái)參與靜態(tài)分析等編譯過(guò)程;而在 Cocoa Touch 中很多的宏其實(shí)都是通過(guò) __attribute__ 來(lái)實(shí)現(xiàn)的,例如:
#define NS_ROOT_CLASS __attribute__((objc_root_class))
而 cleanup 就是在這里會(huì)使用的變量屬性:
The cleanup attribute runs a function when the variable goes out of scope. This attribute can only be applied to auto function scope variables; it may not be applied to parameters or variables with static storage duration. The function must take one parameter, a pointer to a type compatible with the variable. The return value of the function (if any) is ignored.
GCC 文檔中對(duì) cleanup 屬性的介紹告訴我們,在 cleanup 中必須傳入 只有一個(gè)參數(shù)的函數(shù)并且這個(gè)參數(shù)需要與變量的類型兼容。
如果上面這句比較繞口的話很難理解,可以通過(guò)一個(gè)簡(jiǎn)單的例子理解其使用方法:
void cleanup_block(int *a) {
printf(“%d\n”, *a);
}
int variable __attribute__((cleanup(cleanup_block))) = 2;
在 variable 這個(gè)變量離開(kāi)作用域之后,就會(huì)自動(dòng)將這個(gè)變量的指針傳入 cleanup_block 中,調(diào)用 cleanup_block 方法來(lái)進(jìn)行『清理』工作。
實(shí)現(xiàn) defer
到目前為止已經(jīng)有了實(shí)現(xiàn) defer 需要的全部知識(shí),我們可以開(kāi)始分析 libextobjc 是怎么做的。
在 libextobjc 中并沒(méi)有使用 defer 這個(gè)名字,而是使用了 onExit(表示代碼是在退出作用域時(shí)執(zhí)行)
為了使 onExit 在使用時(shí)更加明顯,libextobjc 通過(guò)一些其它的手段使得我們?cè)诿看问褂?onExit 時(shí)都需要添加一個(gè) @ 符號(hào)。
{
@onExit {
NSLog(“Log when out of scope.”);
};
NSLog(“Log before out of scope.”);
}
onExit 其實(shí)只是一個(gè)精心設(shè)計(jì)的宏:
#define onExit \
ext_keywordify \
__strong ext_cleanupBlock_t metamacro_concat(ext_exitBlock_, __LINE__) __attribute__((cleanup(ext_executeCleanupBlock), unused)) = ^
既然它只是一個(gè)宏,那么上面的代碼其實(shí)是可以展開(kāi)的:
autoreleasepool {}
__strong ext_cleanupBlock_t ext_exitBlock_19 __attribute__((cleanup(ext_executeCleanupBlock), unused)) = ^ {
NSLog(“Log when out of scope.”);
};
這里,我們分幾個(gè)部分來(lái)分析上面的代碼片段是如何實(shí)現(xiàn) defer 的功能的:
1. ext_keywordify 也是一個(gè)宏定義,它通過(guò)添加在宏之前添加 autoreleasepool {} 強(qiáng)迫 onExit 前必須加上 @ 符號(hào)。
#define ext_keywordify autoreleasepool {}
2. ext_cleanupBlock_t 是一個(gè)類型:
typedef void (^ext_cleanupBlock_t)();
3. metamacro_concat(ext_exitBlock_, __LINE__) 會(huì)將 ext_exitBlock 和當(dāng)前行號(hào)拼接成一個(gè)臨時(shí)的的變量名,例如:ext_exitBlock_19。
4. __attribute__((cleanup(ext_executeCleanupBlock), unused)) 將 cleanup 函數(shù)設(shè)置為 ext_executeCleanupBlock;并將當(dāng)前變量 ext_exitBlock_19 標(biāo)記為 unused 來(lái)抑制 Unused variable 警告。
5. 變量 ext_exitBlock_19 的值為 ^{ NSLog(“Log when out of scope.”); },是一個(gè)類型為 ext_cleanupBlock_t 的 block。
6. 在這個(gè)變量離開(kāi)作用域時(shí),會(huì)把上面的 block 的指針傳入 cleanup 函數(shù),也就是 ext_executeCleanupBlock:
void ext_executeCleanupBlock (__strong ext_cleanupBlock_t *block) {
?。?block)();
}
這個(gè)函數(shù)的作用只是簡(jiǎn)單的執(zhí)行傳入的 block,它滿足了 GCC 文檔中對(duì) cleanup 函數(shù)的幾個(gè)要求:
只能包含一個(gè)參數(shù)
參數(shù)的類型是一個(gè)指向變量類型的指針
函數(shù)的返回值是 void
- DSP載波移相控制C語(yǔ)言源代碼下載 58次下載
- 使用單片機(jī)實(shí)現(xiàn)62256擴(kuò)展內(nèi)存的C語(yǔ)言程序免費(fèi)下載 12次下載
- 什么是C語(yǔ)言?C語(yǔ)言有哪些優(yōu)勢(shì)及C語(yǔ)言的應(yīng)用資料說(shuō)明
- 如何從Java轉(zhuǎn)型Objective-C的詳細(xì)資料分析 2次下載
- Objective-C與Runtime的詳細(xì)資料介紹讓你不在問(wèn)為什么 3次下載
- ObjectiveC-Class-Ivar-Layout的使用方法詳解 2次下載
- objective-c簡(jiǎn)體中文手冊(cè) 14次下載
- 基于Objective-C實(shí)現(xiàn)動(dòng)態(tài)加載 2次下載
- 從Objective-C向Swift轉(zhuǎn)換經(jīng)驗(yàn)分享 0次下載
- 第15章objective-C編程語(yǔ)言 0次下載
- Objective-C基礎(chǔ)教程 2次下載
- Objective-C.2.0程序設(shè)計(jì)(原書第2版).(美)St 0次下載
- 單片機(jī)IO擴(kuò)展(進(jìn)階)程序集合【C語(yǔ)言】 23次下載
- 單片機(jī)IO輸出擴(kuò)展【C語(yǔ)言+匯編】 12次下載
- 單片機(jī)IO輸出擴(kuò)展集合【C語(yǔ)言】 8次下載
- PLC編程語(yǔ)言和C語(yǔ)言的區(qū)別 6.6k次閱讀
- plc編程語(yǔ)言與c語(yǔ)言的聯(lián)系 c語(yǔ)言和PLC有什么區(qū)別 7k次閱讀
- vb語(yǔ)言和c++語(yǔ)言的區(qū)別 4.1k次閱讀
- 靜態(tài)分析工具 4k次閱讀
- C語(yǔ)言的發(fā)展歷史 5k次閱讀
- C語(yǔ)言語(yǔ)法擴(kuò)展 2.2k次閱讀
- OLLVM和LLVM功能介紹 9.8k次閱讀
- 詳解C語(yǔ)言中的短路現(xiàn)象 4.5k次閱讀
- C語(yǔ)言的誕生 C語(yǔ)言與C++40年的相愛(ài)相殺 1.7k次閱讀
- 面向未來(lái)的五款編程語(yǔ)言 2.2k次閱讀
- C語(yǔ)言的簡(jiǎn)介和特點(diǎn)說(shuō)明 8.8k次閱讀
- 2019年的編程語(yǔ)言排行榜你知道嗎 2.6w次閱讀
- c語(yǔ)言入門書籍推薦 8.7w次閱讀
- 學(xué)習(xí)開(kāi)發(fā)環(huán)境和編程語(yǔ)言:匯編語(yǔ)言和C語(yǔ)言的比較 9.7k次閱讀
- verilog語(yǔ)言與c語(yǔ)言的區(qū)別 1.3w次閱讀
下載排行
本周
- 1MDD品牌三極管BC807數(shù)據(jù)手冊(cè)
- 3.00 MB | 次下載 | 免費(fèi)
- 2MDD品牌三極管BC817數(shù)據(jù)手冊(cè)
- 2.51 MB | 次下載 | 免費(fèi)
- 3MDD品牌三極管D882數(shù)據(jù)手冊(cè)
- 3.49 MB | 次下載 | 免費(fèi)
- 4MDD品牌三極管MMBT2222A數(shù)據(jù)手冊(cè)
- 3.26 MB | 次下載 | 免費(fèi)
- 5MDD品牌三極管MMBTA56數(shù)據(jù)手冊(cè)
- 3.09 MB | 次下載 | 免費(fèi)
- 6MDD品牌三極管MMBTA92數(shù)據(jù)手冊(cè)
- 2.32 MB | 次下載 | 免費(fèi)
- 7STM32G474 HRTIME PWM 丟波問(wèn)題分析與解決
- 1.00 MB | 次下載 | 3 積分
- 8新能源電動(dòng)汽車高壓線束的銅鋁連接解決方案
- 2.71 MB | 次下載 | 2 積分
本月
- 1愛(ài)華AIWA HS-J202維修手冊(cè)
- 3.34 MB | 37次下載 | 免費(fèi)
- 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊(cè)
- 1.63 MB | 23次下載 | 免費(fèi)
- 3NB-IoT芯片廠商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
- 4H110主板CPU PWM芯片ISL95858HRZ-T核心供電電路圖資料
- 0.63 MB | 6次下載 | 1 積分
- 5UWB653Pro USB口測(cè)距通信定位模塊規(guī)格書
- 838.47 KB | 5次下載 | 免費(fèi)
- 6技嘉H110主板IT8628E_BX IO電路圖資料
- 2.61 MB | 4次下載 | 1 積分
- 7蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
- 0.04 MB | 4次下載 | 1 積分
- 8蘇泊爾DCL6909(即CHK-S009)單芯片電磁爐原理圖資料
- 0.08 MB | 2次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191439次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183353次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論