我觉得有更多的监管方式可以做我正在做的事情,无论是通过某些iOS特定事物,还是我所知道的模式。我正在尝试创建一个NSMutableArray
变量,它实际上充当了记录器类的临时存储。每次访问数组时,我想要懒惰地实例化它,或者将它设置为nil。我想这样做的方式看起来有点hacky,我正在寻找一些意见?
- (NSMutableArray)myArray {
if (!_myArray) {
_myArray = [[NSMutableArray alloc] init];
} else {
_myArray = nil;
}
return _myArray;
}
我希望实现的效果是使用记录器来记录有关网络请求的详细信息 - http codes
,URLs
,重复次数等。我希望记录器合并所有这些输出此存储空间array
。稍后,当我点击API时,我想获取此数组的内容,并将其发送到API,我也希望数组重置(因此该数组本质上是一个网络请求数据的日志,因为应用程序最后一次访问API,而不是自应用程序启动以来发生的事件的日志。
我意识到我可以在nil
访问array
时手动执行此操作,但我尝试以更简单的即插即用方式执行此操作如果有人忘记nil
array
等
答案 0 :(得分:3)
你想要达到的效果是完全合法的,但你不应该单独用吸气剂来实现它:一个简单的吸气剂可以将某些东西重置回nil
的事实将是反...对读者来说很直观。
相反,你应该制作两个方法 - 一个用于准备数组,另一个用于收集它,并用新的nil
替换:
- (NSMutableArray*)myArray {
if (!_myArray) {
_myArray = [[NSMutableArray alloc] init];
}
return _myArray;
}
- (NSMutableArray*)resetArray{
NSMutableArray *res = _myArray;
_myArray = nil;
return res;
}
现在,操作顺序变得直观清晰:您可以根据需要多次myArray
,根据需要添加任意数量的项目,然后在完成后调用resetArray
。这将为您提供包含所有数据的完整数组,并重置该对象以准备下次调用:
for (int col = 0 ; col != 10 ; col++) {
[log.myArray addObject:[self getDataForIndex:col]];
}
NSMutableArray* logArray = [log resetArray];
答案 1 :(得分:0)
你在做什么对我没有任何意义。
如果它不存在则将其创建为空是有意义的。
如果确实存在则将其设置为nil 不有意义。
延迟加载的常用模式是使用带有getter的属性:
@property (nonatomic, retain) NSMutableArray * myArray;
然后执行:
//Custom getter
-(NSMutableArray*) myArray;
{
if (!_myArray)
_myArray = [[NSMutableArray alloc] init];
return _myArray;
}
然后你总是使用getter引用数组。如果尚未创建,则getter创建并返回空数组。如果确实存在,则返回现有的。