NSSortDescriptor线程安全吗?

时间:2011-03-13 18:07:24

标签: objective-c thread-safety

我有一个类的setter,我想要在设置中对输入进行排序(它很少被称为成本就好了),我正在考虑帮助使它更快一些我创建静态NSSortDescriptor到因为排序参数总是相同的。

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

- (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...
    }
}

2 个答案:

答案 0 :(得分:0)

NSSortDescriptor没有任何可见的方法来更改它,并且没有任何理由在内部更改其状态,因此它很可能是线程安全的(除非Apple在框架代码中对其进行攻击)我怀疑。)

至于优化,如果没有实际的分析,它(几乎)总是为时过早。在这种情况下,虽然我会对static var做同样的事情 - 主要是为了有一个我的排序策略明确声明/定义的地方。

答案 1 :(得分:0)

documentation specifically州:

  

通常是不可变对象   线程安全的;一旦你创造了它们,你   可以安全地将这些对象传递给和   来自线程。当然,使用时   不可变对象,你仍然需要   记得使用引用计数   正确。如果你不恰当   释放你没有保留的物体,   你可能会在以后引起异常。

正如hoha观察到的那样,NSSortDescriptor是不可变的,除非另有说明,否则它是线程安全的 <(通常在类文档中)。