如何"发布" ARC上的UIWebView

时间:2012-03-18 20:14:44

标签: iphone objective-c ios xcode ios5

我正在尝试开发一个非常简单的浏览器,成为iPad应用程序的一部分。该浏览器将有标签。所有选项卡都基于.xib,UIWebView填充几乎所有.xib帧。 我将所有内容存储在名为NSMutableArray的{​​{1}}内。

所以,这是我在数组中添加新标签的方法: 声明:

·H

tabsArray

的.m

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

我如何在屏幕上显示它:

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

最后,当用户关闭一个标签(带有特定索引)时,我正试图“释放”UIWebView:

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

我的问题是:看来通过这样做我根本就不释放它。内存消耗保持不变,如果我正在播放YouTube视频,则音频会继续播放。 我是编程方面的新手,并且使用ARC开始了iOS 5的iOS开发,所以我可能会放弃一些与内存管理相关的基本细节。

解决方案:

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

2 个答案:

答案 0 :(得分:2)

属性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];

答案 1 :(得分:2)

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

[tabsArray removeObjectAtIndex:index];

然后设置

self.pagina = nil;

致电[self.pagina removeFromSuperView];后,它应该有效。