我一直在为我的iPhone应用程序开发一个对象类,当应用程序的另一部分首次请求图像时,它会延迟加载图像。我决定使图像线程的加载安全,因此相同的图像不会偶然加载两次,但是我很好奇每次运行访问器时进行@synchronized(self)调用的开销,如下所示:
- (UIImage *)image
{
@synchronized(self)
{
if (_image == nil)
{
_image = [UIImage imageWithContentsOfFile:self.imageUrl];
}
}
return _image;
}
首先检查属性是否为n然后使用@synchronized指令会更好吗?
- (UIImage *)image
{
if (_image == nil)
{
@synchronized(self)
{
if (_image == nil)
{
_image = [UIImage imageWithContentsOfFile:self.imageUrl];
}
}
}
return _image;
}
有什么想法吗?
答案 0 :(得分:4)
开销很小,但加载图像的起点可能很大,因此,用同步原语包围它意味着任何阻塞它的东西都可以付出代价......
答案 1 :(得分:2)
首先,UIKit不是线程安全的,所以你需要在这里小心。其次,UIImage会对它进行一些缓存,所以如果你所做的只是从磁盘加载,那么只需使用UIImage imageNamed:。
但是,我猜你可能正在从网络加载图像,在这种情况下你可以使用performSelectorOnMainThread:。但是,如果您只是使用NSURLConnection实现简单的下载,则所有工作都在主运行循环中完成,因此您不需要多线程。