我正在寻找关于在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
答案 0 :(得分:1)
对于任何一个数组,您应该分配其内存并初始化一次。
首先,这意味着最后的替代方案不起作用。它声明这两个变量存在并指向数组,但没有创建和分配它们。
B行创建并初始化一个数组就好了,但是通过将getArray
的结果赋给同一个变量,它立即失去了对它的唯一引用。如果你使用ARC内存管理,这有点浪费;没有ARC,这是一个内存泄漏。
A行还可以正确地创建和初始化数组,并且就您发布的代码而言,这是受myArray
旁边任何操作影响的代码。
(请记住,您声明为变量的内容 - 如NSMutableArray *arr
- 可以被认为是实际对象的名称而不是对象本身。)
答案 1 :(得分:1)
你应该在A中分配内存,但是在B中。 A 中的alloc / init创建变量arr 引用的对象。您将该对象作为方法getArray的返回值传递。
在B中,您只是希望myArray引用返回的对象,您不希望拥有新对象。如果你这样做:
NSMutableArray *myArray = [[NSMutableArray alloc]init]; //line B
myArray = [self getArray];
第一行创建一个新对象并将其分配给myArray。第二行将myArray的值立即替换为从该方法返回的另一个对象。如果没有ARC(自动引用计数),这将导致第一行中创建的对象的内存泄漏。