0

ブロック内で自己を捕らえるのを避けるための一般的なパターンは、ブロックの外側に弱い自己を作成し、これを使用してブロック(内部自己)内に自己の「局所的に強い」バージョンを作成することです。強いポインタに弱いポインタを割り当てるとオブジェクトがコピーされますか?

__weak ClassX *weakSelf = self; 
[someOtherObject methodThatTakesCOmpletionBlock: ^{ 

      ClassX innserSelf = weakSelf; //innserSelf creation?  
      [someObject send:innerSelf.prop;}]; 

innserSelf creation行が実行されるとどうなりますか? がsomeOtherObjectに送信された時点でinnerSelfコピーの自己ですか?

この質問は、innserSelf行が実行されたときに起こることに焦点を当てています。私はStrong reference to a weak references inside blocksを見てきましたが、これは関連していますが、この点には言及していません。

+0

@Josh Caswell答えが私の質問の1つに対処していません。 'ClassX innserSelf = weakSelf;'行が実行されるとどうなりますか?自己オブジェクトをコピーし、そのオブジェクトの参照を保持しますか?私は自分の質問を編集しただけです。あなたは旗を取り除くことができますか? –

+0

ポインタの割り当てがないと、オブジェクトのコピーが作成されます。 –

+0

「ポインタを割り当てないとコピーが作成されますか?」とはどういう意味ですか?あなたは "ポインタの割り当ては**コピーを作成しない**"と言いたいですか?それがコピーを作成しない場合、この内側のものの全体のポイントは何ですか?自己が指摘している「記憶の部分」を強く参照しているように見えます。 –

答えて

0

弱いポインタを強いポインタに割り当てると、オブジェクトはコピーされません。両方のポインタは同じオブジェクトを指します。強力なポインタは保持カウントに+1を加えます。弱いポインタが保持カウント

+0

ありがとうございます。その場合、我々は再び参照サイクルを持っていないのですか?ブロックは自己への強い参照を持ち(innersoleを通して)、自己はブロックする文字列参照を持つ。これとブロック内の自己を直接使用することの違いは何ですか? –

+1

参照サイクルは、ブロックの実行中にのみ存在します。これはおそらく望ましいことです。 – bbum

+0

@bbum、ありがとう。トピックに関連するすべての記事を読むと、weakSelf、innerSelfのダンスを使用しなくても、上のコードは保持サイクルを作成しないように見えます。これは、ブロックを別のオブジェクトに渡して実行するだけだからです。私はそれを自己の財産に保管していません。それは正しい理解ですか? –

2

が検討変化させない:

__weak id weakSelf = self; 
[other doSomething: ^{ 
    __strong id strongSelf = weakSelf; 
    .... 
}]; 

otherコピーブロックを、強い参照が存在しません。

otherがブロックを実行すると、ブロックの実行開始時に強い参照が作成されます。ブロックが完了すると、実行スコープはなくなり、strongSelf参照は破棄されます。

otherがブロックにハングアップするかどうかは関係ありません。 strongSelf参照は、ブロック実行中にのみ存在します

+0

ありがとう@bbum。時間ブロックが実行されるまでに自己割り当てが解除されるとどうなりますか?それでは、強いセルフは無事になるでしょう、正しい理解ですか?ブロックを格納している「その他」についての私の質問は、弱い/自己のダンスが危険な状況を辿っていない状況を見つけ出すことでした。唯一の問題は、他にブロックを格納するプロパティがある場合です。それを実行するだけでは、内側の自己の代わりに "まっすぐな"自己に向いているように見えます。このようにして、ブロック実行時にselfが存在することが保証されます。それが完了すると、ブロックは強い参照を解放し、サイクルを破ります。思考? –

+0

@SmartHome修正; 'strongSelf'はゼロになります。必要に応じて次の行でテストし、ブロックを短絡することができます。 ARCでは、弱い/強い割り当てメカニズムはアトミックです。あなたは無効な 'strongSelf'を得たいと思う。 – bbum

+2

ブロックが実行されない場合は危険です。サイクルを中断するためにブロックを実行する必要がある場合は、ブロックが実行されていない場合、サイクルを中断しないでください。 'other'が実行を遅らせるか、実行を直接指示するかどうかを公開することで、呼び出し側のリファクタリングを難しくし、エラーを起こしやすい実装の詳細が公開されます。 self - > weakSelf - > strongSelfダンスは、コードにノイズを追加する以上のエラーを起こしやすいものではありません。 – bbum

関連する問題