2017-04-12 27 views
0

私は配列に弱いrefrenceを与えたり、配列の割り当てられたメモリを解放する方法を理解していません。誰もこのリークを修正する方法を教えてください。配列に割り当てられたメモリを解放するにはどうしたらいいですか?

var menuDetails:[[String:Any]] = []//this my global array object 

私はARCを使用しています。

Screenshot for array memory leak

私は、そのメモリリークについてだけで怖がっていた誰もが、私はそれを修正しますどのように伝えることができますか?

+0

array @ sharayuのサイズは何ですか –

+0

そのダイナミックはわかりません。 – sharayu

+0

この配列は大量のデータ@ sharayuを持っています –

答えて

3

弱い参照を使用したくないです。もしあなたがそうするなら、あなたの配列はすぐにリリースされるでしょう。

weak var weakArray:[[String:任意]]? = []

作成するとすぐにnilが含まれます。

代わりに、あなたがnil(または空)に配列を設定する必要がありますが内容で終わったら:

あなたは、アレイ内のすべてのエントリを削除するには、 `menuDetails.removeAllを()を使用することができ、またはそのオプション

var menuDetails:[[String:Any]]? = []//this my global array object 

作るためにあなたの宣言を変更して、あなたはそれで終わったときにはnilに設定することができます:別のオブジェクト場合

menuDetails = nil 
+0

これは私が探していたものです...簡単なもの – sharayu

0

オブジェクトにのみ保持されますそれを強く参照しています。ビューコントローラが消えるとすぐに、他のオブジェクトへの強い参照が自動的に削除されます。したがって、imageArrayが消えているView Controllerによってのみ強く参照されると、メモリは自動的に解放されます。 autoreleasepoolを使う必要はありません。

0

弱い参照を配列や辞書に格納するには、中間構造が必要です。例えば

struct WeakRef 
{ 
    weak var object:AnyObject? 
    init(_ objectRef:AnyObject?) 
    { object = objectRef } 
} 

// use WeakRef when you add object instances to your dictionary (or array) 

menuDetails[0]["objectKey"] = WeakRef(yourObject) 

// you will need additional code to get the actual object out of the intermediate structure 
// and given that it is a weak reference you'll also need to deal with its optionality. 

if let yourObject = (menuDetails[0]["objectKey"] as? WeakRef)?.object as? YourClass, 
{ 
    // ... do your thing with your object ... 

} 

構文は、おそらくカスタム演算子とジェネリック医薬品でこれをラップすることによって、より見やすく作ることができるが、これは、それまでの一般的なアプローチです。

関連する問題