【问题标题】:How "release" an UIWebView on ARC如何在 ARC 上“发布” UIWebView
【发布时间】:2012-03-18 20:14:44
【问题描述】:

我正在尝试开发一个非常简单的浏览器来作为 iPad 应用程序的一部分。该浏览器将有标签。所有选项卡都基于一个带有UIWebView 填充几乎所有.xib 框架的.xib。 我将它们全部存储在NSMutableArray 中,称为tabsArray

所以,下面是我向数组添加新选项卡的方法: 声明:

.h

@property (nonatomic,strong) NSMutableArray *tabsArray;
@property (nonatomic,strong) UIDetailWebController *pagina;

.m

self.pagina = [[UIDetailWebController alloc] initWithNibName:@"UIDetailWebController" bundle:nil];
[tabsArray insertObject:pagina atIndex:currentViewTag+1];

我如何在屏幕上显示它:

[self.view addSubview:[[tabsArray objectAtIndex:currentViewTag+1] view]];

最后,当用户关闭选项卡(具有特定索引)时,我尝试“释放” UIWebView:

[[[tabsArray objectAtIndex:index] view] removeFromSuperview];
[[tabsArray objectAtIndex:index] setWebView:nil];
[[tabsArray objectAtIndex:index] setView:nil];
[tabsArray removeObjectAtIndex:index];

我的问题是:似乎这样做我根本不释放它。内存消耗保持不变,如果我正在播放 youtube 视频,音频会继续播放。 我对编程有点陌生,并通过 iOS 5 开始使用 ARC 进行 iOS 开发,所以我可能会放一些与内存管理相关的基本细节。

解决方案:

好的,我发现保留 webview 的是 PullToRefreshView (https://github.com/chpwn/PullToRefreshView) 的实现。当我将它的委托设置为零时;一切正常!

【问题讨论】:

  • 原始代码已经是self.pagina,我只是在格式化问题时输入错误。对不起。
  • 您确定[tabsArray objectAtIndex:index] 中的index 具有正确的值吗?您还确定实际调用了删除视图的代码吗?

标签: iphone objective-c ios xcode ios5


【解决方案1】:

pagina 属性是一个强属性,因此它保留了您在其中分配给它的值:

self.pagina = [[UIDetailWebController alloc] initWithNibName:@"UIDetailWebController" bundle:nil];

所以你应该把它设置为nil:

[tabsArray removeObjectAtIndex:index];
self.pagina = nil; // Add this line.

最后,并不是说可能不需要以下几行:

[[tabsArray objectAtIndex:index] setWebView:nil];
[[tabsArray objectAtIndex:index] setView:nil];

那行:

[[[tabsArray objectAtIndex:index] view] removeFromSuperview];

可以简化为:

[self.pagina removeFromSuperview];

【讨论】:

  • youtube 视频一直在播放...:/
  • 解决不了。不过,大概就是这样。我的代码很广泛,有很多不同的方法可以创建不同类型的选项卡。可能我忘记了中间的东西。我会继续寻找,如果我解决了,我会告诉你的!谢谢! :)
  • 如果不是属性页,我做了“UIDetailWebController *pagina = [UIDetailWebController alloc....] 我不需要做任何事情,对吧?
【解决方案2】:

我认为问题在于您将所有 UIDetailWebControllers 存储在一个数组中。该数组保留指向您的 DetailWebController 的强指针。 你应该使用:

[tabsArray removeObjectAtIndex:index];

然后设置

self.pagina = nil;

调用[self.pagina removeFromSuperView]; 后应该可以工作了。

【讨论】:

  • 没有解决。但是将 self.pagina 设置为 nil 确实可以解决问题。如果我选择不让它成为一个属性,我只是 UIDetailWebController *pagina,我不需要做任何其他事情来释放 webview,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2016-08-05
  • 2023-04-07
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多