ViewController意外取消分配

时间:2010-07-15 22:25:27

标签: iphone

我有一个非常奇怪的问题,我希望能得到一些帮助。

我有ExpenseListViewController,它有fetechResultController,一旦从tableview中选择了一行,代码就会将detailViewController推送到堆栈。

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Create and push a detail view controller.
    ExpenseDetailVeiwController *detailViewController = [[ExpenseDetailVeiwController alloc] initWithStyle:UITableViewStyleGrouped];
    selectedExpense = (Expense *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
    // Pass the selected expense to the new view controller.
    detailViewController.expense = selectedExpense;
    detailViewController.delegate=self;
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

在detailViewController中我保存了上下文,并且调用了ExpenseListViewController上的fetchResultController的回调,但有时候,并不总是,listController已被释放。

在控制台上查看错误消息:

    2010-07-15 18:04:50.404 FunMobile[6396:207] *** -[ExpenseListViewController controllerWillChangeContent:]: message sent to deallocated instance 0x3bc34e0
(gdb) continue
2010-07-15 18:04:52.188 FunMobile[6396:207] *** NSInvocation: warning: object 0x3bc34e0 of class '_NSZombie_ExpenseListViewController' does not implement methodSignatureForSelector: -- trouble ahead
2010-07-15 18:04:52.189 FunMobile[6396:207] *** NSInvocation: warning: object 0x3bc34e0 of class '_NSZombie_ExpenseListViewController' does not implement doesNotRecognizeSelector: -- abort

我认为在这种情况下viewController只有在从堆栈中弹出时才会被释放,这可能是错的?我在ExpenseListViewController的dealloc方法中设置断点,当发生此错误时,它永远不会被调用。

OS 3.1.3和OS 4.0都会出现此问题 在你的帮助下提前感谢。

2 个答案:

答案 0 :(得分:0)

如果您的应用突然使用大量内存,则操作系统将开始释放对象,尤其是使用大量内存的视图控制器。

使用Instruments检查应用程序的内存情况。

覆盖-didReceiveMemoryWarning:以查看是否收到内存警告。您可以使用此便捷方法开始释放未使用的对象。

但如果你的应用程序突然使用了大量内存,这可能会导致设计问题或代码出现问题。使用Instruments在整个应用程序的生命周期内跟踪内存使用情况。

答案 1 :(得分:0)

也许您在delegate中发布了ExpenseDetailVeiwController

这是一个常见错误 - 您为委托声明了非保留属性,然后在dealloc中释放它。