我对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消息是否与其在其他类中的工作方式不同,即。它可能会返回一个自动释放的实例吗?
谢谢!
彼得
答案 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];