【发布时间】:2014-07-10 21:52:24
【问题描述】:
我有一个宏可以执行很棒的日志。但是,它不能在 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 在这里被弱引用?
【问题讨论】:
-
我认为不可能。你总是需要
__weak id weakself = self;在块之前的某个地方。 -
相关:
NSAssert里面包含self,在块中使用也有同样的问题。
标签: objective-c macros c-preprocessor objective-c-blocks self