2011-07-16 20 views
6

Blokları kullanmaya başladım ve karşılaştığım ilk şeylerden biri, kapanışta yakalanan değerleri ayarlamakta yetersiz kalıyor. Bu iyi, uzun bir süre C/C++ kullanıyorum. Sadece işaretçileri kullanacağım!Bloklardaki değerleri değiştirmek için işaretçiler kullanmak güvenli midir?

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; 

Sorum şu, bu güvenli mi? İşaretçim kapsam dışı bırakılan ve hala var olan bir şeye işaret ettiğinde, bunun işe yarayacağını varsayalım. Ama aynı zamanda blokları ele geçiren şeylerin, bunları paralel olarak yürütmediklerini varsayıyorum. kodunun kodunun olmadığını biliyorum, ancak NSArray enumerateObjectsUsingBlock çağrısıyla bir blok kullanmayı bilmiyorum.

cevap

13

değişken bloğu olarak bu orijinal değişkenleri işaretlemek olacaktır bunu yapmak için 'doğru' yolu, __block

+0

Ahh! Var olduğunu bilmiyordum. Mükemmel! Çok teşekkürler. –

İlgili konular