__attribute__
是一個編譯命令, 可以為變量乔宿、函數(shù)、類型定義提供一些屬性.
__attribute__
有很多屬性deprecated际起、unused猜敢、cleanup等等, 本文主要講 cleanup.
cleanup 變量作用域結束之前, 走 cleanup 方法. 但并不是捕捉對象的釋放, 只是走出當前作用域.
基本功能:
變量作用域結束之前, 執(zhí)行cleanup指定的方法,方法的參數(shù)為變量的地址
下面是, 當 block 作用域結束的時候讓 cleanup 執(zhí)行的具體實現(xiàn).
static void cleanBlock(__strong void(^*block)(void)) {
(*block)();
}
#if DEBUG
#define keywordify autoreleasepool {}
#else
#define keywordify try {} @catch (...) {}
#endif
#define onExit \
keywordify \
__strong void(^block)(void) __attribute__((cleanup(cleanBlock), unused)) = ^
keywordify
的作用就是在使用的時候可以在前面加一個@, 可以防止 return-type warning, 使用autoreleasepool
的時候會創(chuàng)建一個沒有實際意義的自動釋放池.
所以使用@try/@catch/@finally
來實現(xiàn)前面加@.
具體可參考 ReactiveCocoa2.5 版本 "RACmetamacros.h".
使用:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
{
{
NSLock *lock = [[NSLock alloc] init];
[lock lock];
@onExit {
[lock unlock];
NSLog(@"end");
};
sleep(5);
NSLog(@"begin");
}
}
});
log:begin
log:end
onExit 主要的作用是在某個塊執(zhí)行結束, 自動執(zhí)行 block, 避免了忘記 unlock.
如果想讓代碼在{}最后執(zhí)行都可以使用 onExit.