ブロック内で自分自身を参照することに頭を悩ませて、保持サイクルを作成しないのに少し問題があります。
私の理解が正しいかどうか教えていただけますか?
ブロック内で自分自身を参照すると、保持サイクルが作成されます。代わりに、ブロック外で自分自身への弱参照を作成してから、ブロック内でその弱参照を使用する必要がありますか?
ありがとう!
ブロック内で自分自身を参照することに頭を悩ませて、保持サイクルを作成しないのに少し問題があります。
私の理解が正しいかどうか教えていただけますか?
ブロック内で自分自身を参照すると、保持サイクルが作成されます。代わりに、ブロック外で自分自身への弱参照を作成してから、ブロック内でその弱参照を使用する必要がありますか?
ありがとう!
はい、それは正しいですが、いくつかの例外があります。
保持サイクルはself
、ブロックを間接的に保持することになった場合にのみ発生します。たとえば、次のプロパティmyblock
にプロパティを設定しself
myproperty
ます。
self.myproperty.myblock = ^{ [self dosomething]; }; // ERROR: Retain Cycle
ただし、次のようなディスパッチコードなどにブロックを使用する場合、保持サイクルは(通常)発生しません。
dispatch_async(dispatch_get_main_queue(), ^{ [self dosomething]; }); // Safe, dispatch_async will not be retained by you
dispatch_async
もちろん、保持サイクルであるという基準を持つブロック内でその関数を呼び出さない限り。
それは本当に紛らわしいです、そしてそれは私が修正されることを望むものです。さて、私自身の意見として:
常にそうであるとは限りませんでした。ARC以前のコードではこれは問題ではありませんでしたが、ブロックはキャプチャしたオブジェクトを自動的に保持するようになったため、問題になります。
self
のタイプを。の__weak instancetype const
代わりに使用することで、非常に簡単に修正できるので、これが修正されることを願っていますinstancetype const
。また、ARCでクラスクラスターを作成する際のいくつかの問題も解決します。これは確かに最大の問題ではありませんが、まだ存在しています。
サイクルを保持する利点に関しては、多くはありません。