UIWebView委托释放混乱

时间:2009-09-23 08:24:27

标签: iphone cocoa-touch uikit

查看UIWebView docs,它说

  

在发布已设置委托的UIWebView实例之前,必须首先将UIWebView委托属性设置为nil,然后再处理UIWebView实例。这可以在例如处理UIWebView

的dealloc方法中完成

我正在UITableView单元格上轻松创建webview。我不知道怎么做“设置委托给nil”位,因为我没有在推送到导航堆栈后跟踪UIWebView。我会想,UIWebView的dealloc方法无论如何都会在委托上调用release?

这就是我正在做的事情:

UIWebView *webView = [[UIWebView alloc] init];
UIViewController *viewController = [[UIViewController alloc] init];
// Start the webview loading, etc
...
// set the delegate
[webView setDelegate:self];
// Add the webview to the viewcontroller
[viewController setView:webView];
[[self navigationController] pushViewController:viewController animated:YES];
[webView release];
[viewController release];

我觉得我应该写

[webView release];
[viewController release];
[self release]; // Releasing the delegate as per the docs.

但这看起来有点尴尬,还是我正确地解释了它?

2 个答案:

答案 0 :(得分:3)

没有。 webView不会释放/保留它的委托它只分配它

UIWebView.h:

@property(nonatomic,assign) id<UIWebViewDelegate> delegate;

你可以在[webView setDelegate:self]之前和之后检查[self retainCount] 它将是相同的

答案 1 :(得分:2)

刚刚发现这个,现在已经老了,但也许答案对某人有用。

文档是正确的,您应该在发布webview之前将委托引用设置为nil。

在您的代码示例中,您将子类化UIViewController,并在子类中重写-dealloc方法以包含视图委托的nullify。

例如:

- (void)dealloc {
   // Clear the webview delegate
   self.view.delegate = nil;
   [super dealloc];
}

HTH