2010-05-22 53 views
0

我有以下的新手问题:这种发布为什么不起作用?

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *anArray; 
    anArray = [dictionary objectForKey: [NSString stringWithFormat:@"%d", section]]; 
    //here dictionary is of type NSDictionary, initialized in another place. 
    AnObject *obj = [[AnObject alloc] init]; 
    obj = [anArray objectAtIndex:0]; 
    [anArray release]; 
    return obj.title; 
} 

如果我运行它,因为它是我会得到一个错误。 如果我不把[anArray发布]它工作得很好。 我不太明白为什么会发生这种情况?

谢谢。

+0

什么JeremyP说。然而,你也不必要地分配了一个'AnObject'的实例,然后将它泄漏到下一行。 – bbum 2010-05-22 18:17:23

回答

2

你绝对必须阅读并理解Cocoa Memory Management Rules,特别是其中规定的基本规则:

你把一个对象的所有权如果您使用名称以“alloc”或“new”开头或包含“copy”(例如alloc,newObject或mutableCopy)的方法创建它,或者如果您将其发送给零售商n消息。您有责任放弃使用发行版或自动发行版所拥有的对象的所有权。任何其他时间你收到一个对象,你必须而不是释放它。

现在,看看你是如何得到一个阵列。您使用了方法objectForKey:它不以alloc开始,也不是新的,也不包含副本。你也没有保留一个阵列。因此,你不拥有一个数组。你不能释放它。

上面引用的规则是关于在iPhone或Mac上使用Cocoa编程而不进行垃圾回收的最重要的知识。其中一张海报上出现了缩写NARC(New Alloc Retain Copy)作为备忘录,非常方便。

让我们将规则应用于代码中名为obj的变量。你通过调用alloc来获得,因此你有责任释放它。但是,您通过调用objectForIndex再次获得它(覆盖以前的值):因此,在此之后,您不得释放它。然而,第一个值需要释放,现在已经泄漏。实际上,分配线是不必要的。

+0

Thnak你,我现在明白了。 – CristiC 2010-05-22 15:03:37

+0

我的答案略有不准确。引用的规则是关于在非* GC环境中编程Cocoa(iPhone不是GC)的最重要知识。 – JeremyP 2010-05-22 15:29:39

1

您不需要释放anArray,因为您没有创建它。字典只是给你一个指向它的指针。

你看起来有创建AnObject的内存泄漏。在下一行中,您将变量“obj”重新赋值为从aArray获得的值。但是你还没有发布你在上面的行中创建的AnObject。

我觉得你的代码应该是这样的:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *anArray; 
    anArray = [dictionary objectForKey: [NSString stringWithFormat:@"%d", section]]; 
    //here dictionary is of type NSDictionary, initialized in another place. 
    obj = [anArray objectAtIndex:0]; 
    return obj.title; 
} 

你并不需要释放您尚未创建什么。

+0

看来我们同时发布了几乎完全相同的答案;) – Jasarien 2010-05-22 14:15:55

1

anArray不会被您分配,保留,复制或刷新,所以您不需要发布它。

另外,你有一个漏洞,你使用alloc/init创建了一个全新的AnObject实例,但是直接从数组中得到一个新的值。

您的代码应该是这样的:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *anArray; 
    anArray = [dictionary objectForKey: [NSString stringWithFormat:@"%d", section]]; 
    //here dictionary is of type NSDictionary, initialized in another place. 
    AnObject *obj = [anArray objectAtIndex:0]; 
    return obj.title; 
} 
+0

他他,你说它*不是*种族:-) – drekka 2010-05-22 14:28:10

相关问题