2011-07-16 4 views
6

블록을 사용하기 시작했고, 내가 만난 첫 번째 문제 중 하나는 클로저에 의해 캡처 된 값을 설정할 수 없다는 것입니다. 이것은 괜찮습니다. 저는 오랫동안 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

아! 그 존재를 몰랐습니다. 완전한! 고마워. –

관련 문제