【问题标题】:Rapidly increasing memory due to load url in UIWebview ios由于 UIWebview ios 中的加载 url 导致内存快速增加
【发布时间】:2014-12-04 17:41:33
【问题描述】:

我正在 UIWebview 中加载 URL,它工作正常。但是在加载 Web 请求期间,它消耗了太多内存。每当我在 UIWebview 中加载一些 URL 时,内存从 30mb 增加到 95mb,并且基于在 UIWebview 中单击的每个链接它仍在增加并达到 180mb 等等。我在 UIWebview 中使用了一些代码来删除内存。但没有任何好处。我已经通过 Xcode 中的分析完成了内存管理,但没有泄漏,我还检查了分配和泄漏。它只是创建了一个 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(nonatomic,strong)UIWebview *webview;

ViewController.m @synthesize 网络视图;

-(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。

【问题讨论】:

    标签: ios objective-c url ios7 uiwebview


    【解决方案1】:

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

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

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

    【讨论】:

    • 内存仍然在泄漏。删除 UIWebview 的委托后内存仍然相同。
    • 请发布您调整后的代码,以便我们查看潜在的剩余错误
    【解决方案2】:

    As dogsgod指出OP释放内存的方式不正确,但是
    对于这类问题,还有其他一些事情需要提及。

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

    viewdidLoad() 中,您分配的对象很好,但如果您首先检查对象是否已分配,则更好(因为它可能会在将其推入导航之前更改它已分配)。

    示例代码

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

    如果你在viewDidLoad() 中分配对象,那么在dealloc() 方法中必须是dealco。

    注意:
    当您分配任何对象 nil 时,这意味着现在对象不指向旧位置并且您无法控制该对象,因此在将 nil 分配给 webview 后调用诸如 [self.webview removefromSuperView] 之类的方法它具有 no effect强>。


    补充说明:
    请阅读document 了解有关 viewDidload、viewWillAppear 等方法的知识。

    【讨论】:

    • 你说的我都试过了,但内存还在增加。
    • 你能分享示例项目吗?
    • 嘿,我解决了这个问题,我使用 WkWebview 而不是 UIWebview。它正在消耗低内存。
    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多