【问题标题】:How to replace this @synchronized(self) code with something more efficient?如何用更有效的东西替换这个 @synchronized(self) 代码?
【发布时间】:2011-10-16 12:53:48
【问题描述】:

我有这个用于原子保留属性的 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),而是使用更有效的东西。

那么在这种情况下,巫毒教的魔法应该是什么样子的呢?

【问题讨论】:

  • 如何使用NSLockalienryderflex.com/NSLock.html.
  • 您是否使用 Instruments 对您的应用进行了分析,以确保这实际上会显着降低您的应用速度?
  • 很好奇——你使用 pthread_mutex 了吗?你的发现是什么?

标签: objective-c ios


【解决方案1】:

本文的结论是 pthread_mutex 是最快的。它也有代码示例。

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

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

另外,测量最简单的方法:@synthesize of the (atomic, retain) 属性。当然,这将具有最少的代码,并且当他们在编译器中优化代码时您不必维护代码 - 您将免费获得他们的优化。

【讨论】:

  • 不错!但是在出于任何原因覆盖 setter 或 getter 时,我不能使用 @synthesize。这里我需要做惰性初始化。
  • 顺便说一句,我无法抗拒用 dontWatchMyProfile 之类的名称查看您的个人资料 :) 很好。
  • 我觉得这个名字很清楚。现在你已经浪费了一些时间!很抱歉 ;-)
猜你喜欢
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2011-01-12
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多