每次访问后,在惰性getter /中重置属性

时间:2015-02-19 14:37:27

标签: ios objective-c

我觉得有更多的监管方式可以做我正在做的事情,无论是通过某些iOS特定事物,还是我所知道的模式。我正在尝试创建一个NSMutableArray变量,它实际上充当了记录器类的临时存储。每次访问数组时,我想要懒惰地实例化它,或者将它设置为nil。我想这样做的方式看起来有点hacky,我正在寻找一些意见?

- (NSMutableArray)myArray {

    if (!_myArray) {
        _myArray = [[NSMutableArray alloc] init];
    } else {
        _myArray = nil;
    }
    return _myArray;
}

我希望实现的效果是使用记录器来记录有关网络请求的详细信息 - http codesURLs,重复次数等。我希望记录器合并所有这些输出此存储空间array。稍后,当我点击API时,我想获取此数组的内容,并将其发送到API,我也希望数组重置(因此该数组本质上是一个网络请求数据的日志,因为应用程序最后一次访问API,而不是自应用程序启动以来发生的事件的日志。

我意识到我可以在nil访问array时手动执行此操作,但我尝试以更简单的即插即用方式执行此操作如果有人忘记nil array

,请不要担心

2 个答案:

答案 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创建并返回空数组。如果确实存在,则返回现有的。