0

強力な保持サイクルが可能であり、使用する必要がある場合をどのように認識できるかを理解しようとしています[weak/unowned self]。不必要な使用でやけどを負い、[weak/unowned self]使用する機会を与える直前に自己の割り当てが解除されました。

たとえば、以下はselfクロージャーで参照する非同期ネットワーク呼び出しです。呼び出し自体を変数に保存せずにネットワーク呼び出しが行われるため、ここでメモリリークが発生する可能性はありますか?

NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {
  (data, response, error) in
  self.data = data
)

次に、NSNotificationCenter を使用した別の例を示します。ここでは、後で非同期に呼び出しを行うことができます。

 NSNotificationCenter.defaultCenter().addObserverForName(
        UIApplicationSignificantTimeChangeNotification, object: nil, queue: nil) {
            [unowned self] _ in
            self.refresh()
    }

私の質問は、強力な保持サイクルが可能なのはどのような場合ですか? クロージャーで自己を参照する非同期呼び出しまたは静的呼び出しを行っている場合、それは の候補になり[weak/unowned self]ますか? これについて何か光を当ててくれてありがとう。

4

2 に答える 2

1

手短に:

保持サイクルは、2 つのケースで発生する可能性があります。

ケース 1:

2 つのインスタンスが相互に強い参照を保持している場合。それらの1つを弱いものとしてマークすることで、これを解決する必要があります。

ケース 2: (質問に関連するもの)

クラス インスタンスのプロパティにクロージャを割り当て、そのクロージャの本体がインスタンスをキャプチャする場合。

あなたの2つの例では、弱い自己を使用する必要はまったくなく、クラスインスタンスのプロパティでNSNotificationCenterもありません。NSURLSession(または他の意味では、それらへの強い参照はありません)

弱い自己を使用する必要があるこの例を確認してください。

[self.mm_drawerController setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) {

    if (drawerSide == MMDrawerSideRight && percentVisible == 1.0) {
        [weakself showOverlayBgWithCloseButton:YES];
    }
    else{

        [weakself hideOverlayBg];
    }
}];

への強い参照がmm_drawerControllerあり、それにクロージャを割り当てますよね?. このクロージャーの中で、私は自己を捉えたいと思っています。したがって、クロージャーは自己への強い参照を持ちます!! これは災害です。その場合、保持サイクルが発生します。このサイクルを断ち切るには、クロージャー内で弱い自己を使用します。

于 2016-05-15T14:07:10.077 に答える
1

保持サイクルは、2 つのオブジェクトが相互に強い参照を持っている状況です。

ここに画像の説明を入力

静的変数 NSURLSession.sharedSession() および NSNotificationCenter.defaultCenter() を使用しており、覚えているかもしれません:

シングルトン オブジェクトは、そのクラスのリソースへのグローバルなアクセス ポイントを提供します...ファクトリ メソッドを介してシングルトン クラスからグローバル インスタンスを取得します。クラスは、最初に要求されたときに唯一のインスタンスを遅延して作成し、その後、他のインスタンスが作成されないようにします。シングルトン クラスは、呼び出し元がインスタンスをコピー、保持、または解放することも防ぎます。

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html

あなたの「自己」インスタンス(他のものと同様)は、シングルトンオブジェクトとそのクロージャーへの強い参照も持っていません。そのため、あなたのケースでは保持サイクルについて心配する必要はありません。

詳細については、この素晴らしい記事を確認してください: https://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/

于 2016-05-15T14:07:28.040 に答える