由于UIWebview ios中的加载URL而导致内存快速增加

时间:2014-12-04 17:41:34

标签: ios objective-c url ios7 uiwebview

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

这是我的代码:

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

@property(非原子,强)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];
  }
}

我将面临这个问题几天。请给我一些替代或方法来删除UIWebviewmemory。

2 个答案:

答案 0 :(得分:0)

viewWillDisapear中您将WebView引用设置为nil,以便下一行中的删除失败。

在完成WebView周围的所有清理后,即在方法的最后一行,尝试将引用设置为nil。

您可能还需要删除WebView的代表(在开始之前)。

答案 1 :(得分:0)

正如狗狗指出OP释放记忆不合适的方式,但是 对于这类问题还有其他一些值得提及的事情。

  • 如果您正在开发新的应用程序,我建议您使用ARC进行项目
  • 如果无法实施ARC,请遵循以下建议

viewdidLoad()中,你分配的对象是好的,但是如果你第一次检查对象是否已被分配,那就更好了(因为它可能会改变它在将其推入导航之前被分配)。

示例代码

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

// Code for allocating memory.

如果您在viewDidLoad()中分配对象,则必须使用dealloc()方法中的deallco。

注意:
当您指定任何对象nil时,表示现在对象未指向旧位置,并且您无法控制该对象,因此在将nil分配给webview之后调用[self.webview removefromSuperView]之类的方法它具有 {{1 }} 即可。

<小时/> 额外说明:
有关viewDidload,viewWillAppear等方法的知识,请阅读此document