2016-04-01 7 views
0

[OK]を、私は強い弱い踊りの理由を理解しています。弱い/強いダンスがこの強い基準サイクルを解決するのはなぜですか?私は理解していない

たとえば、Bがブロックを強く参照しているとし、そのブロックをB内部で強く参照するように設定します(B)。私たちはブロックを強く参照しています。おそらく私たちのブロックは後で実行するヒープ(おそらくasync)に割り当てられ、ブロックはBを強く参照しています。オブジェクトAのみを強く参照しています。 - >ブロックANDブロック - > B.強い参照サイクルとメモリリーク。

私たちがこれを見るかもしれない別の方法は、強く参照しています。BはCを強く参照しています。おそらくCはブロックプロパティを持ち、BはC.block = ^{ self.blah = blah }と言います。今度は、BがCを強く参照し、CがCを強く参照しています.Aが強制終了され、再び強力な参照サイクルがあります。もし私が間違っているなら、私を訂正してください。

今、私は心の中で強い基準サイクルではないという強い基準サイクルを見ています。

私はクラスを持っています。それをAと呼んでください。Aには関数fooBarがあります。 fooBarの中で、

[[MySingleton sharedInstance] doSomeBackgroundJazz: ^{ 
    self.blah = blah; 
}]; 

私たちは強い参照サイクルを見ており、Aは割り当て解除されていません。さて、私の心の中で、AはMySingletonを強く参照していません。たぶん、fooBarの期間はそうですが、クラス自体はありません。しかし、fooBarが完了するとスタックから削除され、MySingletonへの参照はもうありません。もし私がここで間違っているなら、私を訂正してください。今、[MySingleton doSomeBackgroundJazz]のブロックコードがAを強く参照していることがわかりました。しかし、なぜこのことが関係していますか? AはMySingletonを参照していません。 MySingletonは強くAを参照します。弱い強いダンスの必要はありません。

しかし、私は弱い強いダンスを入れたとき..私たちの問題は軽減されました。 Aはもはやつかまえません。 (現実の世界の問題は、ビューを残して帰って来て、新しいビューを作成して、前のビューを保持することです。それぞれが通知を受け取り、API呼び出しを行います。毎秒外出するコール)。

なぜ弱い踊りがこれを解決していますか? Aを想定し

+1

問題を実証する実際のコードがないと問題はかなり無意味です。保持サイクルを作成したり、何かを弱めることなく、あなたのスニペットにあるものを行うことは確かに可能です。 – dan

答えて

1

-doSomeBackgroundJazz:

にあなたの発信者であることは、プロパティにあなたのMySingletonクラスの店あなたのブロックをオフに表示されます。

ブロック内にselfA)をキャプチャしたため、ブロックがプロパティに格納されるとブロックも保持されます。

これは、シングルトンインスタンス(sharedInstance)が保持されている限り、ブロックプロパティが保持されるため、キャプチャしたAが保持されることを意味します。

AはsharedInstanceを保持していなくても、何らかの理由で明らかにぶら下がっています。

ブロックがプロパティに格納されるときは常に、self__weakにキャストします。しかし、常に__weakをキャストすることを傷つけることはありません。ブロックにオブジェクトを保持したい場合はめったにありません。

関連する問題