オブジェクトを遅延して作成し、それを弱いプロパティとして格納するクラスがあります。他のクラスがこのオブジェクトを要求する場合がありますが、オブジェクトの割り当てが解除されないようにするには、明らかにオブジェクトへの強力な参照を保持する必要があります。
// .h
@interface ObjectManager
@property(nonatomic, weak, readonly) NSObject *theObject;
@end
// .m
@interface ObjectManager ()
@property(nonatomic, weak, readwrite) NSObject *theObject;
@end
@implementation ObjectManager
- (NSObject *)theObject
{
if (!_theObject) {
_theObject = [[NSObject alloc] init];
// Perform further setup of _theObject...
}
return _theObject;
}
@end
スキームがXcodeがデバッグ用にビルドするように設定されている場合、問題なく動作します。オブジェクトは呼び出しobjectManagerInstance.theObject
て戻ることができますtheObject
。
スキームがリリース用にビルドするように設定されている場合、次をtheObject
返しますnil
。
// Build for Debug:
NSObject *object = objectManagerInstance.theObject;
// object is now pointing to theObject.
// Build for Release:
NSObject *object = objectManagerInstance.theObject;
// object is now `nil`.
私の推測では、コンパイラーは_theObject
、アクセサーメソッド自体でそれ以上使用されていないことを確認してコードを最適化しているため、nil
戻る前にweak変数がに設定されています。変数を実際に返す前に、強力な参照を作成する必要があるようです。これは、ブロックを使用して行うことしか考えられませんが、面倒なので、避けたいと思います。
ivarがすぐに無効になるのを防ぐためにreturnタイプで使用できるキーワードの種類はありますか?