在我们系统的其他地方寻找内存泄漏,我创建了一个带有元刷新标签的20 MB网页.我们的想法是通过我们的数据路径代码移动大量数据以确认内存稳定性.
<html>
<meta http-equiv="refresh" content="1">
<body>
<div style="border: 1px solid red">
Content loading
</div><!-- 20mb worth of comments -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我发现的是uiwebview显示元刷新页面非常非常快地泄漏内存.即使我们的代码没有播放,应用程序内存也会在大约2分钟内达到300mb并且会在低内存警告上被拍摄.
我已停止刷新加载并尝试取消分享webview.
我试过loadurl:"about:blank",loadhtml:"",javascript文档关闭.
我还尝试编写一个递归的removeFromSuperview和removeFromParentViewController,读取webview中的私有scrollview是一个内存问题,但该内存永远不会被释放.当我们完成它时,我似乎无法找到一种可靠的方法来关闭,取消一个webview.
我们在网页浏览速度缓慢的情况下生活了很长一段时间,并且确实希望找到一种方法来确保在完成后可以完全清理webview.我们最近将应用程序转换为ARC,但没有改变内存速率.
我正在考虑通过webview中的所有对象尝试递归循环,看看它们是否可以被释放.仪器显示20 mb的cfdatas,alive,每次刷新20MB页面,但不会将它们显示为泄漏.如果我只提供响应头并完成urlprotocol客户端我们运行稳定,所以ale确认其余数据路径中的memleaks,但这是一个如此戏剧性的测试用例结果我希望找到一个webview内存泄漏解决方案一次并为所有人.
有没有人有更好的想法,或者有没有人尝试通过uiwebview中的对象进行递归?
我在使用UIWebViews时遇到了问题,我在这里看到了同样的问题,但没有有用的答案.问题在于:UIWebView内存管理.我会引用它:
我正在开发一个大量使用UIWebView的应用程序.这个应用程序在从我的服务器加载内容时动态生成大量的UIWebViews.其中一些UIWebView非常大,并且有很多图片.
如果我使用仪器检测泄漏,我没有检测到任何泄漏.但是,分配了很多对象,我怀疑这与UIWebViews有关.
当webviews因不再需要而发布时,似乎并非所有内存都被释放.我的意思是,在向我的服务器发出请求后,该应用程序创建了一个UITableView和许多webview(仪器说大约8Mb).当用户点击时,所有这些都被释放但内存使用量仅下降约2-3 Mb,使用该应用程序5-10分钟后它崩溃.
我创建了简单的测试应用程序并获得了相同的结果.
这是一个tableView,我正在创建这样的DetailsView:
DetailsVC *detailViewController = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil];
detailViewController.n = indexPath.row;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
Run Code Online (Sandbox Code Playgroud)
在DetailsVC中,我在IB中创建了一个webView.我加载像这样的HTML:
NSString *urlAddress;
if (self.n == 0)
{
urlAddress = @"http://www.google.com";
}
else
{
urlAddress = @"http://www.yahoo.com";
}
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:requestObj];
Run Code Online (Sandbox Code Playgroud)
我也这样做:
- (void)viewDidUnload {
self.webView = nil;
}
Run Code Online (Sandbox Code Playgroud)
就是这样,每次我在RootViewController中选择任何webView时,我都会丢失2-3 Mb的内存,这个问题是否有解决方案?
谢谢.
我目前正在iOS 5.1中构建一个使用ARC的导航控制器应用程序.我经常需要显示网页,我创建了一个Web查看器,它只是一个UIWebView,旁边有一些自定义内容.当用户完成查看页面时,他们点击后退按钮,后退按钮应释放与自定义Web查看器关联的所有内存.我的问题是,当按下后退按钮时,所有内存似乎都没有被释放.我已经构建了一个玩具应用程序(在github上),它只是几个按钮,每个按钮都有一个调用不同页面的第一响应者.
@implementation ViewController
-(IBAction)googlePressed:(id)sender
{
CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.google.com"];
[self.navigationController pushViewController:customWebView animated:NO];
}
-(IBAction)ksbwPressed:(id)sender
{
CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.ksbw.com/news/money/Yahoo-laying-off-2-000-workers-in-latest-purge/-/1850/10207484/-/oeyufvz/-/index.html"];
[self.navigationController pushViewController:customWebView animated:NO];
}
-(IBAction)feedProxyPressed:(id)sender
{
CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://feedproxy.google.com/~r/spaceheadlines/~3/kbL0jv9rbsg/15159-dallas-tornadoes-satellite-image.html"];
[self.navigationController pushViewController:customWebView animated:NO];
}
-(IBAction)cnnPressed:(id)sender
{
CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.cnn.com/2012/04/04/us/california-shooting/index.html?eref=rss_mostpopular"];
[self.navigationController pushViewController:customWebView animated:NO];
}
Run Code Online (Sandbox Code Playgroud)
CustomWebView只是在IB到UIWebView属性中链接的UIWebView
@implementation CustomWebView
@synthesize webView, link;
- (id)initWithStringURL:(NSString *) stringURL
{
if (self = [super init]) {
link = stringURL;
}
return self;
}
- (void)viewDidLoad …Run Code Online (Sandbox Code Playgroud) 我已经尝试了所有这些(一,二,三,四)解决方案,但是当我从Web视图屏幕返回到之前的viewController后,它会冻结大约2秒钟(有时更多).viewWillAppear中没有任何内容会导致冻结.
这是viewWillDisappearweb视图控制器:
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[detailWebView stopLoading];
detailWebView.delegate = nil;
NSLog(@"viewWillDisappear called !!!");
}
Run Code Online (Sandbox Code Playgroud)
第一个viewController:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:41.0/255.0 green:151.0/255.0 blue:132.0/255.0 alpha:1.0]];
UIImage *imagePlus = [[UIImage imageNamed:@"create.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
buttonCreate = [UIButton buttonWithType:UIButtonTypeCustom];
[buttonCreate setImage:imagePlus forState:UIControlStateNormal];
[buttonCreate addTarget:self action:@selector(createActivity:) forControlEvents:UIControlEventTouchUpInside];
buttonCreate.frame = CGRectMake(self.view.frame.size.width - 40, 10, 16, 16);
[self.navigationController.navigationBar addSubview:buttonCreate];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"back", nil) style:UIBarButtonItemStylePlain target:nil action:nil];
[backButton setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]} forState:UIControlStateNormal];
self.navigationItem.backBarButtonItem …Run Code Online (Sandbox Code Playgroud) 我正在开发的应用程序保留了几个WebView,这些WebView用于为集中在应用程序周围的某些活动提供嵌入式Web浏览体验.我遇到的问题是,打开几个小时后,经过大量使用后,视图开始积累内存.我对Objective-C中的内存管理的理解是,一旦对象被完全释放(保留count = 0)并且被释放,整个应用程序使用的内存量就会减少.这似乎不适用于我的情况.
[webviewObject release];
webviewObject = nil;
webviewObject = [[self createNewViewWithName:name] retain];
Run Code Online (Sandbox Code Playgroud)
以上是我正在使用的代码.我试过释放内存而不是创建一个新实例,但没有运气.内存使用量继续增长,根据Instruments的说法,对象完全释放.我错过了什么吗?应用程序可以缓存一些如何?
uiwebview ×4
ios ×3
memory ×3
iphone ×2
ios5 ×1
memory-leaks ×1
objective-c ×1
refresh ×1
webkit ×1
webview ×1