Безопасно ли использовать указатели для изменения значений в блоках? - PullRequest
6 голосов
/ 17 июля 2011

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

1 Ответ

13 голосов
/ 17 июля 2011

«Правильный» способ сделать это - пометить эти исходные переменные как изменяемые блоки, __block

...