如何用更高效的方式替换@synchronized(self)代码?

4

我有一个用于原子保留属性的getter/setter对:

- (FileManager*)fileManager {
    @synchronized(self) {
        if (fileManager) {
            return fileManager;
        }

        FileManager *fm = [[FileManager alloc] init];
        self.fileManager = fm;
        [fm release];

        return fileManager;
    }
}
- (void)setFileManager:(FileManager *)newFileManager {
    @synchronized(self) {
        [fileManager release];
        fileManager = [newFileManager retain];
    }
}

现在有人说@synchronized(self)非常慢,而NSLock则快得多。他还说,通常使用的神奇@synthesize实现并不使用@synchronize(self),而是使用更高效的东西代替。
那么,在这种情况下,这种神秘的魔法是什么样子的呢?

如何使用NSLock: http://alienryderflex.com/NSLock.html - thomas
你是否使用Instruments对你的应用进行了性能分析,以确保这实际上会显著地减慢你的应用程序? - Brian Coleman
好奇 - 你是用 pthread_mutex 吗?你有什么发现吗? - bryanmac
1个回答

3

这篇文章得出的结论是pthread_mutex是最快的。它还提供了代码示例。

http://www.cocoadev.com/index.pl?NSLockVsSynchronized

但是,最重要的是在您自己的应用程序中进行测量。

此外,请对最简单的方法进行测量:@synthesize(原子性,retain)属性。当然,这将具有最少的代码,而且您不必在编译器优化时维护代码-您将免费获得它们的优化。


不错!但是无论出于何种原因,当覆盖setter或getter时,我都不能使用@synthesize。在这里,我需要进行延迟初始化。 - dontWatchMyProfile
顺便说一句,我忍不住看了你的个人资料,因为像dontWatchMyProfile这样的名字很有意思。不错。 - bryanmac
我认为这个名称非常清晰明了。现在你浪费了些时间!对此很抱歉 ;-) - dontWatchMyProfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接