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]の候補になりますか?これについて何か光を発してくれてありがとう。

答えて

1

一言で言えば、

保持サイクルは2つの場合に起こる可能性があります。

ケース1:

2つのインスタンスが互いに強い参照を保持します。あなたは弱いものとしてそれらの1つをマークすることによってこれを解決しなければなりません。

ケース2:(あなたの質問に関連している)

あなたはクラスインスタンスのプロパティに閉鎖し、そのクロージャの本体を割り当てた場合は、インスタンスをキャプチャします。

あなたの2つの例では、NSNotificationCenterNSURLSessionもクラスインスタンスのプロパティであるため、弱い自己を使用する必要はありません。

チェック私は弱い自己使用する必要があり、この例(またはその他の意味で、あなたはそれらへの強い参照を持っていない):私はmm_drawerControllerへの強い参照を持っている

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

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

     [weakself hideOverlayBg]; 
    } 
}]; 

を、私は閉鎖を割り当てますそれは正しい?この閉鎖の中で私は自己を捕まえたい。だからクロージャーは自分自身への強い参照を持つでしょう!それは災害です。その場合、保持期間があります。このサイクルを壊すには、クロージャの内部に弱い自己を使用します。

1

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

enter image description here

あなたは静的変数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/

関連する問題