我在我的属性上使用惰性实例化,以尽可能快地创建和使用我的类。为了实现这一点,我写了很多像这样的“空” setter/getter :
- (VMPlacesListFilter *)currentFilter
{
if (!_currentFilter) {
_currentFilter = [[VMPlacesListFilter alloc] init];
}
return _currentFilter;
}
都是一样的:如果实例变量是nil
,调用属性类的-alloc
和-init
,然后返回实例变量。非常常见和直接。
如果我不自己创建这个 getter,Objective-C 的自动合成会为我创建一个 getter,它只做返回部分(如果实例变量为 nil
,则不会初始化对象) ).
有什么办法可以避免编写这种样板代码吗?
最佳答案
不,如果你真的想要惰性初始化,恐怕没有好的解决办法。就个人而言,我通常会为可能真正耗时或内存密集型的东西(例如,加载图像或 View Controller )保存惰性初始化,并在 init
中初始化便宜的东西(如简单的数据结构或模型对象) .
- (instancetype) init {
self = [super init];
if( self ) {
_cheapThing1 = [NSMutableArray array];
_cheapThing2 = [[MyModelObject alloc] init];
}
return self;
}
- (ExpensiveThing*) expensiveThing
{
if( _expensiveThing == nil ) {
_expensiveThing = [[ExpensiveThing alloc] init];
}
return _expensiveThing;
}
除非您从磁盘或网络加载某些东西,否则我不会太担心初始化时间。当然,剖析它。
我知道这是一个 Objective-C 问题,但值得注意的是 Swift 内置了惰性初始化。
lazy var currentFilter = VMPlacesListFilter()
关于objective-c - 比写几十个空的 getter 更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30775741/