2

我有以下方法:

-(NSMutableArray *)someArray{ // line 1
    if(self.someArray == nil){ // line 2
        self.someArray = [[NSMutableArray alloc]init];
    }  
    return self.someArray;
}

我在非 ARC 中有这个,它工作正常:如果self.someArray第 2 行是nil,那么继续实例化它。

但是,在我切换到 ARC 后,当它到达第 2 行时,它又回到第 1 行,并且循环继续。

任何帮助将不胜感激。谢谢。

4

3 回答 3

5

self.someArray 调用 getter,因此是无限循环。在该方法中使用 _someArray (假设您使用的是属性提供的自动 ivar。否则,请使用您的支持变量)。

于 2013-02-09T00:56:20.753 回答
5

正确的形式是

@synthesize someArray = _someArray;
- (NSMutableArray *)someArray {
    if (!_someArray) {
        _someArray = [NSMutableArray array];
    }
    return _someArray;
}
于 2013-02-09T00:57:31.117 回答
2

发生的事情是您在访问器内部调用访问器方法。但是,如果每个访问者都调用自己,那么您将永远不会打破这个循环。

使用自动合成属性来避免这种情况:

-(NSMutableArray *)someArray{ // line 1
    if(_someArray == nil){ // line 2
        _someArray = [[NSMutableArray alloc]init];
    }  
    return _someArray;
}
于 2013-02-09T00:55:57.630 回答