2011-04-04 61 views
3

我一直在爲我的iPhone應用程序開發一個對象類,它在應用程序的另一部分首次請求它時加載圖像。我決定使圖像線程的加載安全,因此不會偶然加載同一圖像兩次,但是我很好奇每次運行訪問器時都會執行@synchronized(self)調用的開銷,如下所示:@synchronized(self)有多少開銷?

- (UIImage *)image 
{ 
    @synchronized(self) 
    { 
     if (_image == nil) 
     { 
      _image = [UIImage imageWithContentsOfFile:self.imageUrl]; 
     } 
    } 
    return _image; 
} 

首先檢查屬性是否爲零然後使用@synchronized指令會更好嗎?

- (UIImage *)image 
{ 
    if (_image == nil) 
    { 
     @synchronized(self) 
     { 
      if (_image == nil) 
      { 
       _image = [UIImage imageWithContentsOfFile:self.imageUrl]; 
      } 
     } 
    } 
    return _image; 
} 

有什麼想法?

回答

4

的開銷很小,但加載圖像可能是巨大的,因此,您使用原始同步圍繞着它的ovhead意味着什麼阻止對可能付出的代價....

2

首先,UIKit不是線程安全的,所以你需要在這裏小心。其次,UIImage自己做一些緩存,所以如果你所做的只是從磁盤加載,那麼就使用UIImage imageNamed :.

但是,我猜你可能是從網絡加載圖像,在這種情況下,你可以使用performSelectorOnMainThread :.但是,如果您只是使用NSURLConnection實現簡單的下載,則所有工作都在主運行循環內完成,因此您不需要多線程。

+0

感謝信息!我的問題是更多關於@ synchronized標籤比其他任何東西。只是發現自己想知道開銷。 – 2011-04-06 15:53:25

相關問題