iphone - Objective C 无法释放 UIViewController

标签 iphone objective-c memory-leaks crash

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

// 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 加载完成之前,还会显示一个事件指示器。

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

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

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

仍在尝试了解发生了什么。有任何想法吗?提前致谢。

最佳答案

我怀疑您正在将 TableViewController 设置为 UIWebView 的委托(delegate),并且您在 the documentation 中错过了此消息:

Important: Before releasing an instance of UIWebView for which you have set a delegate, you must first set its delegate property to nil. This can be done, for example, in your dealloc method.

如果您忘记在 dealloc 中删除委托(delegate),即使委托(delegate)不再存在,Web View 最终也可能会尝试发送委托(delegate)消息。繁荣。

关于iphone - Objective C 无法释放 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5188174/

相关文章:

objective-c - 按下时更改 UIView 的外观(但尚未释放)

c - 即使在调用 fclose() 之后,由于 fopen() 而导致的内存泄漏

java - Android ArrayList 内存泄漏

iphone - 如何将国际象棋 AI 移植到 iPhone

iphone - Xcode 无法识别 iPhone 5s,dyld_shared_cache_extract_dylibs 失败

javascript - Android 或 ios 平台上的 Node -WebKit 应用程序

iphone - 下载前计算文件大小

objective-c - XCode 显示函数参数热键

objective-c - Cocoa Objective C,在创建数组时获取 EXC_BAD_ACCESS?

c++ - 列出 "cold"内存区域