Я начал использовать блоки, и одной из первых вещей, с которыми я столкнулся, является невозможность установить значения, которые фиксируются замыканием.Это нормально, я давно пользуюсь 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.