我有一个非常奇怪的问题,我希望能得到一些帮助。
我有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都会出现此问题 在你的帮助下提前感谢。
答案 0 :(得分:0)
如果您的应用突然使用大量内存,则操作系统将开始释放对象,尤其是使用大量内存的视图控制器。
使用Instruments检查应用程序的内存情况。
覆盖-didReceiveMemoryWarning:
以查看是否收到内存警告。您可以使用此便捷方法开始释放未使用的对象。
但如果你的应用程序突然使用了大量内存,这可能会导致设计问题或代码出现问题。使用Instruments在整个应用程序的生命周期内跟踪内存使用情况。
答案 1 :(得分:0)
也许您在delegate
中发布了ExpenseDetailVeiwController
?
这是一个常见错误 - 您为委托声明了非保留属性,然后在dealloc
中释放它。