我的代码(尤其是当我更多地了解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)你认为它的风格很恶心吗?风格上很棒吗?