首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSSortDescriptor线程安全吗?

NSSortDescriptor线程安全吗?
EN

Stack Overflow用户
提问于 2011-03-14 02:07:24
回答 2查看 238关注 0票数 1

我有一个setter类,我想让输入在设置上排序(它的调用频率足够低,成本也可以),我想让它更快一点,因为排序参数总是相同的,所以我会创建一个静态的NSSortDescriptor来使用。

不过,setter应该是原子的,我想知道在@synchronized块之外的多个线程中使用相同的NSSortDescriptor实例是否安全(因为我要在进入@synchronized块之前对传入的数组进行排序)。下面的代码线程安全吗?或者这是不是过早地进行了优化?

代码语言:javascript
复制
- (void) setMyArray:(NSArray*)newMyArray
{
    static NSArray *sorter = nil;

    @synchronized(self)
    {
      if ( sorter == nil )
      {
        NSSortDescriptor *sortObj = [NSSortDescriptor sortDescriptorWithKey:@"size" ascending:YES];
        sorter = [[NSArray arrayWithObject:sortObj] retain];
      }
    }

    NSArray *sorted = [myNewArray sortedArrayUsingDescriptors:sorter];

    @synchronized(self) 
    {
       // set iVar from sorted array...
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-14 04:12:27

documentation specifically声明:

不可变对象通常是线程安全的;一旦创建了它们,就可以安全地将这些对象传递到线程或从线程传递这些对象。当然,在使用不可变对象时,您仍然需要记住正确使用引用计数。如果您不适当地释放了未保留的对象,则可能会在以后导致异常。

正如hoha所观察到的,因为NSSortDescriptor是不可变的,所以除非特别说明(通常在类文档中),否则它是线程安全的。

票数 0
EN

Stack Overflow用户

发布于 2011-03-14 02:20:50

NSSortDescriptor没有任何可见的方法来改变它,也没有任何理由在内部改变它的状态,所以它很可能是线程安全的(除非苹果在框架代码中对它进行了黑客攻击,我对此表示怀疑)。

至于优化,在没有实际分析的情况下(几乎)总是为时过早。不过,在本例中,我将对static var做同样的事情-主要是为了有一个地方清楚地声明/定义我的排序策略。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5291335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档