質問のトピックからの変数宣言が正当であるかどうか疑問に思っています。次のコードを想像してください。
__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
すると、ブロックの内部/外部にコードを安全にコピー/移動できますが、保持サイクルが発生するリスクはありません (ivar を除きますが、それらは悪です)。 NSAssert
ブロック内でリテイン サイクルが発生しなくなりました。
更新この手法がマクロに使用さlibextobjc
れ
ていることを発見しました。@weakify/@strongify