2011-07-16 29 views
6

Tôi đã bắt đầu sử dụng các khối và một trong những điều đầu tiên tôi gặp phải là không có khả năng đặt các giá trị được chụp bởi đóng. Điều này là tốt, tôi đã sử dụng C/C++ một thời gian dài. Tôi sẽ chỉ sử dụng con trỏ!Có an toàn khi sử dụng con trỏ để thay đổi giá trị trong các khối không?

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; 

Câu hỏi của tôi là an toàn không? Tôi giả sử rằng miễn là con trỏ trỏ đến thứ gì đó đã không đi ra khỏi phạm vi và vẫn tồn tại, nó sẽ hoạt động. Nhưng tôi cũng giả định rằng những thứ có khối không bao giờ, nói, chạy chúng song song. Tôi biết mã số của tôi không, nhưng tôi không biết, bằng cách sử dụng một khối có lệnh gọi NSArray enumerateObjectsUsingBlock.

Trả lời

13

Cách 'đúng' để thực hiện việc này là đánh dấu các biến ban đầu là khối có thể thay đổi, __block

+0

Ahh! Không biết rằng đã tồn tại. Hoàn hảo! Cảm ơn rất nhiều. –

Các vấn đề liên quan