美文网首页iOS调试技巧
__attribute__((cleanup(function)

__attribute__((cleanup(function)

作者: 幸运者_Lucky | 来源:发表于2017-03-24 14:55 被阅读269次

__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.

参考:黑魔法attribute((cleanup))

相关文章

网友评论

    本文标题:__attribute__((cleanup(function)

    本文链接:https://www.haomeiwen.com/subject/hiwxottx.html