将消息释放到UINavigationController对象

时间:2010-07-19 04:51:18

标签: ios cocoa-touch memory-management uinavigationcontroller

我对Cocoa编程比较陌生,内存管理的某些方面仍然让我很烦恼。

在这种情况下,我使用alloc消息创建一个UINavigationController,并使用UIView控制器对其进行初始化。然后,我通过将视图传递给presentModalViewController方法来呈现视图。以下是代码:

- (void)tableView:(UITableView *)tableView 
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped on disclosure button");
NewPropertyViewController *newProperty = [[NewPropertyViewController alloc] 
                                          initWithDictionary];
newProperty.editProperty = [fetchedResultsController objectAtIndexPath:indexPath];
UINavigationController *newPropertyNavigationController = [[UINavigationController 
                                          alloc] 
                                          initWithRootViewController:newProperty];
[newProperty setPropertyDelegate:self];
[self presentModalViewController:newPropertyNavigationController animated:YES];

[newProperty release];
[newPropertyNavigationController release];
}

根据保留计数规则,如果我将消息“alloc”发送到一个类,则返回该类的实例,保留计数为1,我负责释放它。在上面的代码中,我将newPropertyNavigationController实例传递给modalViewController并将其呈现后发布。当我关闭模态视图时,应用程序崩溃。

如果我注释掉最后一行,则该应用不会崩溃。

为什么会这样? UINavigationController的特定alloc / init消息是否与其在其他类中的工作方式不同,即。它可能会返回一个自动释放的实例吗?

谢谢!

彼得

2 个答案:

答案 0 :(得分:2)

您需要停止正在进行的操作并通读this。内存管理规则非常简单易懂。让他们被烧到你的头上(不需要很长时间)。然后在您的问题点中逐行检查您的代码,并从您的代码中调用api。在规则新鲜的时候,以这种方式遍历你的代码,将有助于你解决你的记忆问题,也许,只是可能,帮助你防止将来制作它们。

答案 1 :(得分:1)

创建模态视图控制器的方式看起来是正确的。检查模态视图控制器上dealloc的实现,看看问题是否存在。

如果您错误地删除了内存,则可以解释为什么在释放模态视图控制器时只会出现错误。

作为参考,我发现以下autorelease的使用更具可读性和可维护性

NewPropertyViewController *newProperty = [[[NewPropertyViewController alloc] 
                                      initWithDictionary] autorelease];
newProperty.editProperty = [fetchedResultsController objectAtIndexPath:indexPath];
UINavigationController *newPropertyNavigationController = [[[UINavigationController 
                                      alloc]
                                      initWithRootViewController:newProperty] autorelease];
[newProperty setPropertyDelegate:self];
[self presentModalViewController:newPropertyNavigationController animated:YES];