質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

WebViewで画面遷移したときのメモリ使用量について

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 2,391
退会済みユーザー

退会済みユーザー

初めて質問させて頂きます。
環境は、Xcode6.1, Swift1.1 です。

下記のテストコードは、WebViewを表示させて画面遷移(URLジャンプ)を
繰り返しているだけなのですが、どんどんメモリ使用量が増えてしまい、
instruments などを見ても原因が分からず困っています。

一応、メモリ管理のドキュメントなどを見て
https://developer.apple.com/jp/devcenter/ios/library/japanese.html
WebViewのキャッシュ、cookieが怪しいと思い、
・init()でその容量を0する
・タイマーの度にキャッシュを削除する
としているつもりです。
これらをコードに含める事で少しはマシになったのですが、
まだまだ増え続けてしまいます。

WebView に詳しい方がいましたら、
怪しいと思う箇所でも構いませんので教えて頂けないでしょうか。
よろしくお願いします。

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var view: NSView!

    var webview: TWVWebView!

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        
        webview = TWVWebView()
        webview.frame = NSRect(x: 0, y: 100, width: 1200, height: 1000)
        view.addSubview(webview)
    
    }
}

import Foundation
import WebKit

class TWVWebView: WebView {
    
    let tInterval: NSTimeInterval! = 5.0
    var timer: NSTimer?
    var i: Int! = 0
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init() {
        // init()内の具体的な値は何でも良い
        super.init(frame: NSRect(x: 0, y: 0, width: 300, height: 500), frameName: nil, groupName: nil)
        self.frameLoadDelegate = self
        
        timer = NSTimer.scheduledTimerWithTimeInterval(tInterval, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
        
        // キャッシュの容量を0にする
        NSURLCache.sharedURLCache().memoryCapacity = 0
        NSURLCache.sharedURLCache().diskCapacity = 0
    }
    
    // WebView の Delegate
    // 今回は関係なし
    override func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!) {
    }
    override func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!) {
    }
    override func webView(sender: WebView!, didFailProvisionalLoadWithError error: NSError!, forFrame frame: WebFrame!) {
    }
    
    // Timer で画面遷移を繰り返す
    func update() {
        
        if i == 0 {
            self.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.google.co.jp/")!))
            i = i + 1
        } else if i == 1 {
            self.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.yahoo.co.jp")!))
            i = i + 1
        } else {
            self.goBack()
            i = i - 1
        }
        twvDeleteCache()
    }
    
    // キャッシュ、cookie を削除する
    func twvDeleteCache() {
        var cookie: NSHTTPCookie
        var storage: NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
        var ary: Array = storage.cookies!
        for cookie in ary {
            storage.deleteCookie(cookie as NSHTTPCookie)
        }
        NSURLCache.sharedURLCache().removeAllCachedResponses()
    }
}



  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る