我想知道问题主题的变量声明是否合法。想象一下下面的代码:
__weak typeof(self) weakSelf = self;
[self doSomethingThatMayCauseRetainCycleWithBlock:^{
typeof(self) self = weakSelf; // <---- !!!!
if (self == nil) return;
NSAssert(self.someProperty != nil, @"This doesn't lead to retain cycle!");
[self doSomething];
self.someProperty = someValue;
// even
self->someIvar = anotherValue;
}
这段代码在 Xcode 4.5.2 中完美运行,只给出一个警告,即Declaration shadows a local variable
.
这个怪癖有什么意义:
- 重新声明
self
为对弱变量的强引用后,您可以安全地在块内部/外部复制/移动代码,而不会有偶尔创建保留循环的风险(除了 ivars,但它们是邪恶的)。 NSAssert
在一个块中不再导致保留周期。
更新
我发现这种技术libextobjc
用于@weakify/@strongify
宏。