与@synchronized(self)相关的开销是多少?

时间:2011-04-04 23:33:44

标签: iphone objective-c multithreading ios

我一直在为我的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;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

开销很小,但加载图像的起点可能很大,因此,用同步原语包围它意味着任何阻塞它的东西都可以付出代价......

答案 1 :(得分:2)

首先,UIKit不是线程安全的,所以你需要在这里小心。其次,UIImage会对它进行一些缓存,所以如果你所做的只是从磁盘加载,那么只需使用UIImage imageNamed:。

但是,我猜你可能正在从网络加载图像,在这种情况下你可以使用performSelectorOnMainThread:。但是,如果您只是使用NSURLConnection实现简单的下载,则所有工作都在主运行循环中完成,因此您不需要多线程。

相关问题