具有弱自我的Objective-C宏

时间:2014-07-10 21:52:25

标签: objective-c macros c-preprocessor objective-c-blocks self

我有一个执行令人敬畏的日志的宏。但是,它不能在self拥有的块中使用,因为它将形成保留周期。

令人敬畏的日志:

#define AWESOME_LOG(__FORMAT__, ...) ALog((@"%p %s:%d " __FORMAT__), self, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

不那么棒的保留周期:

- (void)someMethod:(BOOL)awesome
{
    self.dumbBlock = ^{
        AWESOME_LOG(@"Is this awesome? %@", awesome ? @"Yes" : @"No");
    };
}

是否有任何预处理器巫毒可以确保self在这里被弱引用?

1 个答案:

答案 0 :(得分:2)

尝试使用@ weakify / @ strongify。它创建了一个新的弱/强引用,可以隐藏self

http://blog.aceontech.com/post/111694918560/weakifyself-a-more-elegant-solution-to

- (void)someMethod:(BOOL)awesome {
    @weakify(self);
    self.dumbBlock = ^{
        @strongify(self);
        AWESOME_LOG(@"Is this awesome? %@", awesome ? @"Yes" : @"No");
    };
}