NSMutableArray从viewDidLoad初始化

时间:2013-04-03 14:09:43

标签: ios nsmutablearray exc-bad-access

arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]];

arrayOfElements = [[NSMutableArray alloc] init];
arrayOfElements = [someObj getArray];

有什么区别?

第一个arrayOfElementsnumberOfRowsInSection:(NSInteger)section中返回计数时似乎没有丢失其对象,但第二个{...}}。当我第二种方式时,我得到EXC_BAD_ACCESS。

修改

我现在可以假设这是最好的方法,

arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];

因为我正在使用autorelease'd的内容初始化一个数组,现在我在当前类中有一个完全独立的数组,即viewDidLoad,oops抱歉,{{ 1}}。

3 个答案:

答案 0 :(得分:2)

此行从现有数组

创建NSMutableArray
arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]];

此组合首先创建NSMutableArray,然后立即丢弃它,将其替换为[someObj getArray]

返回的内容
arrayOfElements = [[NSMutableArray alloc] init]; // Create new NSMutableArray
arrayOfElements = [someObj getArray];            // Throw away the newly created array and replace with the result of [someObj getArray]

如果您没有使用ARC,那么完全可以通过运气来实现。

在这两种情况下,arrayOfElements都会被分配一个autorelease' d对象 - 很快就会被清除(很可能是下一个runloop)。只是偶然的是,没有其他任何东西写在这个内存点上,这使得你的一个实现仍然可以工作。


如果您不使用ARC,那么您应该更新您的项目以便使用它将为您处理很多此类案例。

你绝对应该使用属性(不是裸ivars),因为这有助于减少内存问题(对于非ARC)并为代码提供更一致的界面。

在标题(或类扩展名)中声明属性,如此

@property (nonatomic, strong) NSMutableArray *arrayOfElements;

现在对于ARC,您可以轻松完成

[self setArrayOfElements:[[someObj getArray] mutableCopy];

对于非ARC你可以做

NSMutableArray *array = [[someObj getArray] mutableCopy];
[self setArrayOfElements:array];
[array release]; array = nil;

另请注意,getArray是一个错误的方法名称。

  

除非间接返回一个或多个值,否则不必使用“get”。   Coding Guidelines

答案 1 :(得分:0)

当您从另一个数组向可变数组添加对象时,请尝试:

[arrayOfElements addObjectsFromArray: [someObj getArray]];

答案 2 :(得分:0)

如果您不使用ARC,则需要确保保留它。

if (arrayOfElements) {
    [arrayOfElements release];
}
arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];