2014-12-04 23 views
0

我在UIWebview中加载URL并且它工作正常。但是在加载Web请求期间它消耗的内存太多了。每当我在UIWebview中加载一些URL时,内存就会从30mb到95mb,并基于在UIWebview中点击的每个链接,它仍然在增加,达到180MB等。我使用了一些代码来移除UIWebview中的内存。但没有任何好处。我已经完成了Xcode中的Analyze内存管理,但没有泄漏,我也检查分配和泄漏。它只是创建一个UIWebview的实例。由于UIWebview中的加载URL导致的内存快速增加ios

这是我的代码:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    int cacheSizeMemory = 4*1024*1024; // 4MB 
    int cacheSizeDisk = 32*1024*1024; // 32MB 
    NSURLCache *sharedCache = [[[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"] autorelease]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
} 

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    [[NSURLCache sharedURLCache] removeAllCachedResponses]; 
} 

ViewController.h

@属性(非原子,强)的UIWebView *的WebView;

ViewController.m @synthesize webview;

-(void)viewdidLoad 
{ 
    NSString *urlString = @"some url"; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [self.webview=[uiwebview alloc]init]; 
    [self.webview loadRequest:request]; 
} 

/*的WebView代表

-(void)viewWillDisappear:(Bool)animated 
{ 
    self.webview=nil; 
[self.webview removefromSuperView] 
[self.webview loadHtmlString:@"" baseUrl:nil] 
    [[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest]; 
    [[NSURLCache sharedURLCache] removeAllCachedResponses]; 
    for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) 
    { 

     if([[cookie domain] isEqualToString:someNSStringUrlDomain]) { 

     [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
    } 
} 

我面对这个问题了几个days.Please给我一些替代或方法去除UIWebviewmemory。

回答

0

viewWillDisapear您正在设置WebViewnil的引用,因此下一行中的删除失败。

在完成围绕WebView的所有清理之后,即在方法的最后一行中,尝试将您的引用设置为零。

您可能还需要删除WebView(在nilling之前)的代理。

+0

不过内存leaking.The内存仍然去除的UIWebView的委托后一样。 – 2014-12-05 16:14:33

+1

请发表您的调整后的代码,以便我们可以看到潜在的剩余错误 – dogsgod 2014-12-05 16:54:52

0

作为dogsgod指出方式OP释放内存是不妥当的,但
还有其他事情要提到的这类问题。

  • 如果您正在开发新的应用程序,我建议你使用ARC为您的项目
  • 如果它不可能实现ARC然后按照下面的建议

viewdidLoad()你分配对象这很好,但如果你首先检查是否已经分配了对象,那么它会更好(因为在将对象推入导航之前它可能会被分配)。

示例代码

if(self.webview!=nil) 
{ 
self.webview = nil; // release memory 
} 

// Code for allocating memory. 

如果viewDidLoad()你的alloc的对象则必须在dealloc()方法deallco。

注:
当您指定的任何对象为零,这意味着现在的对象是不是指向原来的位置,你必须在该对象的控制权,因此调用了一些方法,像[self.webview removefromSuperView]分配零到的WebView它有后no effect


额外注:
请有关类似的viewDidLoad,viewWillAppear中方法的知识阅读本 document ...等

+0

我尝试了您所说的任何内容,但内存仍在增加。 – 2014-12-05 16:16:35

+0

你可以分享样品项目吗? – Jageen 2014-12-06 02:11:49

+0

嘿,我解决了这个问题,我用WkWebview代替UIWebview.It消耗的内存很少。 – 2014-12-06 04:59:21