2014-12-04 53 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