2011-07-16 6 views
6

ブロックの使用を開始しました。最初に遭遇したことの1つは、クロージャによって取り込まれた値を設定できないことです。これはいいです、私はC/C++を長年使っています。私はちょうどポインタを使用します!ブロック内の値を変更するためにポインタを使用するのは安全ですか?

MyObject* bestObj = nil; 
float bestDist= 10000.f; 

MyObject **pBestObj = &bestObj; 
float* pBestDist = &bestDist; 

[self testObjects:class block:^(MyObject* obj){ 

     CGRect r = [obj boundingBox]; 
     // position is captured from outside this code sample 
     if(CGRectContainsPoint(r, position)) 
     { 
      float dist = GetDistance(obj, position); 

      if(dist < bestDist) 
      { 
       *pBestDist = dist; 
       *pBestObj = obj; 
      } 
     } 
}]; 

return bestObj; 

私の質問は安全ですか?私は、私のポインタが範囲外になっていないものがまだ存在していることを指している限り、それはうまくいくはずだと思います。しかし、私はまた、ブロックを取るものは、それを並行して実行することはないと仮定しています。私は私のコードを知っているが、私は知らない、例えば、NSArray enumerateObjectsUsingBlock呼び出しでブロックを使用して知っている。これを行うには

答えて

13

「正しい」方法は__block

+0

ああ、変更可能なブロックとして、それらの元の変数をマークするだろう!その存在を知らなかった。完璧!どうもありがとう。 –

関連する問題