2011-04-04 45 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

相关问题