id __weak weakLayer;
ARC プロジェクトでは、スーパーレイヤーによって保持される CALayer に__weak ivar (として宣言) を設定しています。ほとんどの場合、これでうまくいきます。弱い ivar が nil とテストされることがあります。問題を示すデバッグを簡単にするために、いくつかのテスト コードを作成しました。これは無限ループになると思いますが、通常は 20 回未満の反復で発生します。ブレイクアウトに必要な反復回数は一定ではありません。
array = [NSMutableArray array];
while (1) {
CALayer *layer = [CALayer layer];
[array addObject:layer];
weakLayer = layer;
if (!weakLayer) {
NSLog (@"nil");
break;
}
NSLog(@"not nil");
}
po weakLayer
内のアクションでブレークポイントをドロップするとif
、有効なオブジェクトが出力されます。Lion および Mountain Lion SDK を使用して、Xcode 4.3.3 および 4.4 でテストしました。