目标C何时进行Alloc和Init澄清

时间:2012-10-15 18:02:06

标签: objective-c memory-management

我正在寻找关于在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

2 个答案:

答案 0 :(得分:1)

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

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

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

A行还可以正确地创建和初始化数组,并且就您发布的代码而言,这是受myArray旁边任何操作影响的代码。

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

答案 1 :(得分:1)

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

在B中,您只是希望m​​yArray引用返回的对象,您不希望拥有新对象。如果你这样做:

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

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