オブジェクトパラメータを取るObjective-Cメソッドがあり、そのメソッドがブロックを使って内部的に処理を行っている場合、そのオブジェクトをブロック内から変更する方法はありますか?ブロック内のObjCメソッドのパラメータを変更するにはどうすればよいですか?
ブロックは、ブロック内で変数を参照して変数を親スコープから取得し、デフォルトでコピーされることは理解しています。そして、もし私が周囲のオブジェクトのコピーで作業するのではなく修正することができたいなら、その宣言に__block
という接頭辞を付けることができますが、私はそれを自分で宣言していないのでメソッドパラメータではできません。例えば
:あなたがキャプチャについて言う何
- (void)doWorkWithString:(NSString *)someString
{
[NSFoo doAwesomeClassMethodWithBlock:^{
// How can I modify someString here directly?
// By just changing someString, I'm changing the captured copy
}];
}
私はドキュメントを調べるのが面倒ですが、ブロックへのキャプチャされた変数はコピーされているとは思いません。オブジェクトはコピーを実装しないかもしれないので、それは非常に驚くべきことです。 __blockが指定されていない場合、オブジェクトはブロックによって保持されます。ブロック内では、オブジェクトポインタはどこにもありませんので、あなたの質問に答えるために、好きなように修正することができます。 * IF * __blockが提供されていない変数に書き込むことはできません。 __blockでマークされた変数はブロックによって保持されないので、注意してください。うまくいけばそれはある意味があります。 –
@darren:ブロックへの非_ブロック変数*がコピーされます。しかし、変数の値は決してオブジェクトではありません。 *オブジェクトポインタ*のみを持つことができます。つまり、ブロックがオブジェクトポインタを取得すると、ポインタがコピーされます。これは、オブジェクトのコピーとはまったく関係ありません。 – newacct
「オブジェクトパラメータ」と言ったとき、私は「オブジェクトポインタ」パラメータを意味しました。例えばNSString *インスタンスを渡します。 –