这可能是一个愚蠢的问题,但在TableViews的介绍中,作者有一个NSArray * listData的属性来用虚拟数据填充表。在viewDidLoad中,他基本上是这样做的:
- (void)viewDidLoad {
NSArray *array = [[NSArray alloc] initWithObjects@"1", @"2", @"3", more stuff, nil];
self.listData = array;
[array release];
...
}
为什么他创建另一个数组并将其设置为属性而不是像
那样- (void)viewDidLoad {
listData = [[[NSArray alloc] initWithObjects@"1", @"2", @"3", more stuff, nil]autorelease];
使用alloc / init与自动释放池是否更好地管理内存?或者第二种方式是不起作用?感谢。
答案 0 :(得分:1)
您的代码错误,可能会崩溃。在他的代码中,他调用alloc
,意味着保留计数为1.然后他将其分配给一个属性。我假设这个属性被声明为retain
,在这种情况下,保留计数将达到2.然后他调用release
,它将保留计数减少回1。
在你的代码中,你调用alloc
,意味着保留计数为1,然后你调用autorelease
,这意味着保留计数将降为0,对象的内存将很快被释放。您将对象分配给实例变量 - 而不是像他那样保留属性 - 因此您不会再增加保留计数。这意味着您将留下一个悬挂指向内存的指针,可以随时用其他任何内容覆盖。当您尝试访问listData
时,您将崩溃,因为它可能已被覆盖。
如果您不明白这里发生了什么,请阅读Memory Management Programming Guide。
话虽如此,你问题的核心是有效的。除了分配保留属性而不是实例变量之外,没有什么可以阻止他做同样的事情。