0

我正在寻找有关在 Objective C 中初始化变量的一些说明。

假设我有一个返回数组的方法。

-(NSMutableArray *) getArray
{
    NSMutableArray *arr = [[NSMutableArray alloc]init];  //line A

for(int i = 0; i < 10; i++)
{
    [arr addObject:@"word"];
}

return arr;
}

然后我调用这个方法。

NSMutableArray *myArray = [[NSMutableArray alloc]init];  //line B
                myArray = [self getArray];

那么我应该在 A 行和 B 行中分配内存,既不在,也应该只在 A 或 B 中分配内存?替代方案很简单

NSMutableArray *arr;      //replacing line A
NSMutableArray *myArray;  //replacing line B
4

2 回答 2

1

您应该在 A 中分配内存,但在 B 中。A 中的 alloc/init创建变量 arr 所引用的对象。您将该对象作为方法 getArray 的返回值传递。

在 B 中,您只希望 myArray 引用返回的对象,您不希望有一个新对象。如果你这样做:

NSMutableArray *myArray = [[NSMutableArray alloc]init];  //line B
                myArray = [self getArray];

第一行创建一个新对象并将其分配给 myArray。第二行立即将 myArray 的值替换为从该方法返回的另一个对象。如果没有 ARC(自动引用计数),这将导致在第一行创建的对象的内存泄漏。

于 2012-10-15T18:16:33.883 回答
1

对于任何一个数组,您都应该分配其内存并对其进行一次初始化。

首先,这意味着您最后的替代方案行不通。它声明这两个变量存在并且将指向数组,但没有创建和分配它们。

B 行很好地创建和初始化了一个数组,但随后通过将结果分配给getArray同一个变量,立即失去了对它的唯一引用。如果使用ARC内存管理,那就有点浪费了;没有 ARC,就是内存泄漏。

A 行还正确地创建和初始化了一个数组,并且就您发布的代码而言,它会受到您在myArray.

(请记住,您声明为变量的东西——比如NSMutableArray *arr——可以被认为是实际对象的名称,而不是对象本身。)

于 2012-10-15T18:14:41.810 回答