我有一个类的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...
}
}
答案 0 :(得分:0)
NSSortDescriptor
没有任何可见的方法来更改它,并且没有任何理由在内部更改其状态,因此它很可能是线程安全的(除非Apple在框架代码中对其进行攻击)我怀疑。)
至于优化,如果没有实际的分析,它(几乎)总是为时过早。在这种情况下,虽然我会对static var做同样的事情 - 主要是为了有一个我的排序策略明确声明/定义的地方。
答案 1 :(得分:0)
通常是不可变对象 线程安全的;一旦你创造了它们,你 可以安全地将这些对象传递给和 来自线程。当然,使用时 不可变对象,你仍然需要 记得使用引用计数 正确。如果你不恰当 释放你没有保留的物体, 你可能会在以后引起异常。
正如hoha观察到的那样,NSSortDescriptor是不可变的,除非另有说明,否则它是线程安全的 <(通常在类文档中)。