帮助我理解为什么我不必分配这个NSMutableArray

时间:2011-07-07 04:33:10

标签: iphone dealloc init

在firstViewController中,

SecondViewController *secondViewController = [[[SecondViewController alloc] init] autorelease];
// Pass data to secondViewController
[secondViewController setClass1:anObjectFromFirstViewController];
[[self navigationController] pushViewController:secondViewController ...];

SecondViewController.m

Class1 *class1;
NSMutableArray *object2;

在viewDidLoad中, 我认为object2指向与class1相同的对象,因此不需要分配。

[self setObject2:[class1 someNSMutableArray]];

在init中,我不必分配object2,整个应用程序仍然有效。是因为object2指向内存中与[class1 someNSMutableArray]相同的项目。

如果是这种情况,那么如果我确实分配了object2会发生什么。会有2份吗?如果我初始化它,应用程序仍然可以正常工作。

-(id)init { object2 = [[NSMutableArray alloc] init]; }

令人困惑的部分是,如果我使用autorelease初始化,它会给我一个dealloc错误,释放到释放的对象错误

-(id)init { object2 = [[[NSMutableArray alloc] init] autorelease]; }

非常感谢!!!

1 个答案:

答案 0 :(得分:1)

您对问题第一部分的想法是正确的。

[self setObject2:[class1 someNSMutableArray]];

object2是一个变量,现在包含与[class1 someNSMutableArray]相同的地址。所以两者都指向相同的NSMutableArray对象。

这与以下不同:

object2 = [[NSMutableArray alloc] init];

在这种情况下,你有创建一个新的NSMutableArray对象,并将那个地址放在object2实例变量中。所以现在指向的是与[class1 someNSMutableArray]不同的数组。

关键词是“创造”。将alloc / init视为创建新对象。

关于内存管理:

object2 = [[[NSMutableArray alloc] init] autorelease];

我假设您(正确地)在此类的-dealloc中释放object2。所以你有两个版本(在dealloc中发布,加上这个自动释放)只针对一个retain(来自alloc / init),因此你过度释放了对象。