2016-10-24 5 views
1

いくつかのオブジェクトを保存できるキャッシュを作成する必要がありますが、メモリの警告が表示されたり、単純にユーザーが必要としている時点で、現時点ではキャッシュにはしか使用されていません。未使用のオブジェクトを要求によってパージできるキャッシュ

つまり、ARCカウント== 1のオブジェクトを除外する必要があります。問題は、このプロジェクトの私のグーグルに基づいて、純粋なSwiftではオブジェクトの保持カウントを得ることができないということです。

私の経験から、Swiftではデフォルトでは不可能であることがわかりました。 Objective-Cで、私はキャッシュから返されたプロキシオブジェクトを、使用していた、そのようなメソッドのオーバーライドた:

// Forward class checks for assertions. 
-(BOOL)isKindOfClass:(Class)aClass {return [_target isKindOfClass:aClass];} 

- (id)forwardingTargetForSelector:(SEL)aSelector 
{ 
    return(_target); 
} 

をしかしスウィフトイデオロギーには適用されないのはもちろんです。

私は、WeakBoxの配列にキャッシュを置くことを考えていますが、未使用のオブジェクトは使用されなくなり、自分の要件を満たさないときに割り当てが解除されます。

誰かが私にいくつかのガイドをすることができますか?私が気付いていない、そのようなことを達成するための迅速な可能性?

答えて

1

オブジェクトの保持カウントを混乱させる必要はありません。あなたのキャッシュは、強力な参照を保持することができます。これにより、保持カウントが常に1以上であることが保証されます。メモリ警告を受け取ったら、キャッシュ内のすべてのポインタをループし、それをnilに設定するだけです。他の誰も強い参照を持っていないと仮定すると、これは参照カウントを0に減らし、オブジェクトは直ちにdeinitを呼び出してメモリから消失します。キャッシュがパージを実行したときにオブジェクトが実際にメモリから消失するようにしたい場合は、キャッシュだけが保持されているアイテムへの強い参照を持ち、他のすべてが弱い参照を取るようにしてください。

fileprivate var controllers = [UIViewController?](repeating: nil, count: DashboardInfo.Category.allValues.count) 

    override func didReceiveMemoryWarning() { 
     //Release every off screen controller 
     for index in 0 ..< controllers.count { 
      if controllers[index] != currentController { 
       controllers[index]?.removeFromParentViewController() 
       controllers[index]?.view.removeFromSuperview() 
       controllers[index] = nil 
      } 
     } 
    } 
+0

ARAC> 1のオブジェクトをキャッシュに保存したい場合はどうすればよいですか? – s1ddok

+0

彼らはすべての強い参照がなくなるまで消えません。この動作は、強力な参照が定義される方法です。参照を解放するまでオブジェクトは解放されません。キャッシュをいつでも削除できるようにするには、唯一の強力な参照を持つ必要があります。弱い参照とオプションのアンラッピングを使用する必要があります。それらのオブジェクトはいつでも割り当て解除できるためです。 –

関連する問題