2016-11-30 6 views
0

を私は以下の機能を持っているが、メインバンドル内に保存されたファイルの内容を取得することで、テキストビューのテキストを変更します。クリアメモリ - iOSのスウィフト

func setUpText() { 

    let path = Bundle.main.path(forResource: book, ofType: "txt") 

    var rawText = "" 
    do { 
     rawText = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) 
    } catch { 
     print("Contents of File could not be retrieved") 
    } 

    myTextView.text = rawText 

} 

すると、ユーザbookの値を変更すると、この関数が呼び出され、テキストビューに新しいテキストが設定されます。すべて正常に動作しますが、CPU、メモリ、ディスク、ネットワークの使用状況を示すデバッグナビゲータで、テキストを再投入するたびにメモリが上昇し続けることに気付きました。テキストを変更する前にメモリをクリアするにはどうすればよいですか?

はここsetUpTextがのviewDidLoadで呼び出された方法は次のとおりです。私もdropdownMenu.didSelectItemAtIndexHandlerの閉鎖で、以下の機能にsetUpTextを呼んでいる

aiv.startAnimating() 
myTextView.text = "" 
DispatchQueue.main.async { 
    self.setUpText() 
    self.aiv.stopAnimating() 
    self.aiv.isHidden = true 
} 

。これが私の問題の原因です。これを追加すると、インストゥルメントによって検証されたようにメモリがダウンすることなく登ります。私は保持サイクルを引き起こす何も表示されません

func createDropdownMenu(title: String, items: [AnyObject]) -> BTNavigationDropdownMenu { 

    let dropdownMenu = BTNavigationDropdownMenu(navigationController: self.navigationController, 
               containerView: self.navigationController!.view, 
               title: title, 
               items: items) 

    dropdownMenu.didSelectItemAtIndexHandler = { (indexPath: Int) ->() in 
     self.chapterIndex = indexPath + 1 
     self.setUpText() 
    } 

    return dropdownMenu 

} 
+0

コードがよく見え、メモリがリークしないはずです。あなたはたぶん閉鎖の中からそれを呼びますか? – shallowThought

+0

実際には、私は閉鎖の中からそれを呼び出す、私はちょうどそれが呼び出される方法を示すために投稿を編集した。 –

答えて

0

... 自己は閉鎖への強い参照を持っていないので、あなたがそこに罰金です。

ARCの下では、メモリ自体を消去することはできません。手動でオブジェクトの割り当てを解除することはできません(また、それは要点です)。私が推測するところは、比較的遅く/高価な操作であるディスクから文字列を読み取っているため(相対的に強調)、システムが少なくとも一時的にキャッシュされている可能性があります。これは、[UIImage imageNamed:]などの特定の場合に発生します。

これは実際に問題を引き起こしていますか?あなたはそれをまったく装備しましたか?

+0

私はそれを実装していませんが、このメモリリークではメモリ使用量が制限されていて、ユーザーが理論的にはアプリケーションをクラッシュさせるのに十分なメモリを使用できるため、問題だと思います。私はクロージャーで弱いまたは無関係の参照を使用してこの問題を解決できると、それを実装する方法を知っていますか? –

+0

1)漏れがあることをどのように知っていますか?あなたはそれを装備していません。もっと重要なことは、ここで解決しようとしている実際の問題は何ですか?あなたがそれをすべきだと思うとすぐに消えない小さな割り当ては問題ではありません。あなたが本当に問題があるまで、ARCにそのことをさせ、記憶について心配しないでください。問題はユーザーが気づくものです。アプリがクラッシュしたり、何かをしっかりと実行したりします。早期の最適化はすべての悪の根源であり、そのすべて... –

+0

2)あなたは共有するスニペットに少なくとも保持期間はありません。保持サイクルは、2つのオブジェクトが相互に強い参照を持つ場合に発生します。閉鎖の場合には、(a)閉鎖が「自己」を強く捕捉し、(b)「自己」が閉包*への強い参照*を持つときに起こります。パート 'b'はここでは真実ではありません。例えば、プロパティとしてクロージャーにぶら下がっているわけではありません。 dispatch_async呼び出し(fire-and-forget)に渡すだけです。再び...リラックス! :D –

関連する問題