簡體   English   中英

由於UIWebview iOS中的加載URL而迅速增加了內存

[英]Rapidly increasing memory due to load url in UIWebview ios

我正在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(nonatomic,strong)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。

viewWillDisapear您將WebView引用設置為nil因此下一行中的刪除失敗。

完成圍繞WebView所有清理后,即在方法的最后一行,嘗試將引用設置為nil。

您可能還需要刪除WebView的委托(在取消操作之前)。

如dogsgod所指出的,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]類的方法將no effect


特別說明:
請閱讀本文檔以獲取有關諸如viewDidload,viewWillAppear ...等方法的知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM