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

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

有什么不同?

第一个arrayOfElements在返回 count in 时似乎没有丢失它的对象numberOfRowsInSection:(NSInteger)section,但第二个确实。当我以第二种方式执行此操作时,我得到 EXC_BAD_ACCESS。

编辑:

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

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

因为我正在初始化一个包含任何内容的数组autorelease,并且我现在在当前类中有一个完全独立的数组,也就是说viewDidLoad,哎呀对不起,ViewController

4

3 回答 3

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 对象 - 它将很快被清除(很可能是下一个运行循环)。只是偶然没有在这个内存点上写入任何其他内容,这使得您的一个实现仍然可以工作。


如果您不使用 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”。 编码指南

于 2013-04-03T14:23:17.103 回答
0

当您将对象从另一个数组添加到可变数组时,请尝试以下操作:

[arrayOfElements addObjectsFromArray: [someObj getArray]];
于 2013-04-03T14:15:06.433 回答
0

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

if (arrayOfElements) {
    [arrayOfElements release];
}
arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];
于 2013-04-03T14:19:22.867 回答