1

.h で宣言された次のブロックがあります

@property (strong, nonatomic) void(^setHandedness)(BOOL hand);

一致する .m で定義されます

 setHandedness = ^(BOOL hand){
    _isRightHanded = hand;
};

宣言された同じ形式のブロックを持つ子View Controllerに渡されます。弱いものを除いて

@property (weak, nonatomic) void(^setHandedness)(BOOL hand);

strong を weak に置き換えると、警告が削除されます。しかし、私はなぜ理解していないのですか?

次に、ブロックが子View Controllerで呼び出されます

setHandedness(handedness);

保持サイクルが発生する可能性があるという警告が表示されますか? 何か案は。乾杯。

4

2 に答える 2

4

警告の理由は次のとおりです。

  1. オブジェクトはプロパティにブロックを保持します。
  2. インスタンス変数にアクセスするため、ブロックはオブジェクトを保持します。

これで、相互に参照する 2 つのオブジェクトができました。他の誰もそれらを参照していなくても、それらは互いに存続し、割り当てが解除されることはありません。

これは、ブロックと変数に関するAppleのドキュメントからの引用です

参照によってインスタンス変数にアクセスする場合、self は保持されます。

2 番目のビュー コントローラーは、保持サイクルとは関係ありません。

于 2012-04-24T09:06:13.023 に答える
1

通常、親が強いポインターで子を指し、子が別の強いポインターで親を指している場合、保持サイクルが発生する可能性があります。 ARC作品)。子ポインターを弱いものに置き換えると、これは起こりません。

于 2012-04-24T09:04:02.543 に答える