@synchronized(self)有多少开销?
问题描述:
我一直在为我的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;
}
有什么想法?
答
的开销很小,但加载图像可能是巨大的,因此,您使用原始同步围绕着它的ovhead意味着什么阻止对可能付出的代价....
答
首先,UIKit不是线程安全的,所以你需要在这里小心。其次,UIImage自己做一些缓存,所以如果你所做的只是从磁盘加载,那么就使用UIImage imageNamed :.
但是,我猜你可能是从网络加载图像,在这种情况下,你可以使用performSelectorOnMainThread :.但是,如果您只是使用NSURLConnection实现简单的下载,则所有工作都在主运行循环内完成,因此您不需要多线程。
感谢信息!我的问题是更多关于@ synchronized标签比其他任何东西。只是发现自己想知道开销。 – 2011-04-06 15:53:25