【问题标题】:objective C Unable to release UIViewControllerObjective C 无法释放 UIViewController
【发布时间】:2011-03-04 00:00:53
【问题描述】:

我有一个 UIViewController 的子类也实现了 UITableViewDelegate。
基本上,会显示一个 UITableView,选择一个单元格会推送一个新视图。
以下是代码的外观:

// NavigationContentsViewController.h
@interface NavigationContentsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

    IBOutlet UITableView * newsTable;
    UIActivityIndicatorView * activityIndicator;
}

///////////////////////////////////////////////////////////////////////
// placed in NavigationContentsViewController.m

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

    NSInteger selectedCellItem = indexPath.row;

    TableViewController *fvController = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:[NSBundle mainBundle]];
    fvController.selectedCellItem = selectedCellItem;
    fvController.link = [links objectAtIndex:selectedCellItem];
    [self.navigationController pushViewController:fvController animated:YES];
    [fvController release];  // #1 if removed everything works fine but getting a leak
    fvController = nil;      // #2
}
///////////////////////////////////////////////////////////////
//  TableViewController.h
@interface TableViewController : UIViewController <UIWebViewDelegate>{
    NSInteger selectedCellItem;
    IBOutlet UIWebView *myWebView;
    NSString *link;
    UIActivityIndicatorView *activityIndicator;
}

因此,当用户选择一个单元格时,会推送一个新的 UIWebView。
在 webView 完成加载之前,还会显示一个 Activity Indicator。

我的问题是,如果用户在 webView 完成加载之前选择从 webView 返回到上一个视图(带有表格的视图),则应用程序崩溃,出现此错误:“[TableViewController respondsToSelector:]:消息发送到已释放实例 0x4b57460"

如果 webView 已完成加载并且用户选择返回,则一切正常。

我设法通过删除代码中标有 #1 和 #2 的两行来解决此问题,但随后出现内存泄漏(因为我没有释放 TableViewController)。

仍在尝试了解正在发生的事情。有任何想法吗?提前致谢。

【问题讨论】:

    标签: iphone objective-c memory-leaks crash


    【解决方案1】:

    我怀疑您将 TableViewController 设置为 UIWebView 的委托,而您在 the documentation 中错过了这条消息:

    重要提示:在释放您已为其设置委托的UIWebView 实例之前,您必须首先将其委托属性设置为nil。例如,这可以在您的 dealloc 方法中完成。

    如果您忘记在 dealloc 中删除委托,Web 视图最终可能会尝试发送委托消息,即使委托不再存在。轰隆隆。

    【讨论】:

    • 这正是我正在做的,这正是我所缺少的......非常感谢您的回复!接受的答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多