私のコード (特にTDDに慣れるにつれて) には、次のような遅延ロードされたプロパティがたくさんあります。
@interface MyClass ()
@property (nonatomic, strong) MyFoo *myFoo;
@end
@implementation MyClass
- (MyFoo *)myFoo {
if (!_myFoo) {
_myFoo = [MyFoo alloc] sharedFoo]; // or initWithBar:CONST_DEF_BAR or whatever
}
return _myFoo;
}
@end
または、より良い、スレッドセーフなバージョン:
- (MyFoo *)myFoo {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_storeHelper = [SHStoreHelper sharedStoreHelper];
});
}
次のように、Apple がそれをプロパティの一部として自動コード生成の対象にしてくれたらいいのにと思います。
@property (lazyload) MyFoo *myFoo;
ただし、それを除けば、次のような実装ビットのマクロが必要です。
#define LAZY_ALLOC(x, y, _y, a, i) -(x *)y { if (!_y) { _y = [[x a] i]; } return _y }
そして、通常のメソッド実装の代わりに
LAZY_ALLOC(MyClass, myClass, _myClass, alloc, init)
必要なクラスに十分な柔軟性があります
LAZY_ALLOC(OtherClass, otherClass, _otherClass, sharedClass, nil)
また
LAZY_ALLOC(OtherClass, otherClass, _otherClass, alloc, initWithFrame:SOME_FRAME)
1) プリプロセッサには _y が必要です。_autosynthesized ivar を個別に渡さずに構築する方法はありますか? 2) これには大きな問題がありますか? 私にとっては、完全に書き出されたバージョンよりも本質的に「ああ、もう一度」と言うので、読みやすさが向上します 3) スタイル的に厄介だと思いますか? スタイル的に素晴らしい?