__attribute__
是一个编译命令, 可以为变量、函数、类型定义提供一些属性.
__attribute__
有很多属性deprecated、unused、cleanup等等, 本文主要讲 cleanup.
cleanup 变量作用域结束之前, 走 cleanup 方法. 但并不是捕捉对象的释放, 只是走出当前作用域.
基本功能:
变量作用域结束之前, 执行cleanup指定的方法,方法的参数为变量的地址
下面是, 当 block 作用域结束的时候让 cleanup 执行的具体实现.
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
的时候会创建一个没有实际意义的自动释放池.
所以使用@try/@catch/@finally
来实现前面加@.
具体可参考 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 主要的作用是在某个块执行结束, 自动执行 block, 避免了忘记 unlock.
如果想让代码在{}最后执行都可以使用 onExit.
网友评论