我有一个setter类,我想让输入在设置上排序(它的调用频率足够低,成本也可以),我想让它更快一点,因为排序参数总是相同的,所以我会创建一个静态的NSSortDescriptor来使用。
不过,setter应该是原子的,我想知道在@synchronized块之外的多个线程中使用相同的NSSortDescriptor实例是否安全(因为我要在进入@synchronized块之前对传入的数组进行排序)。下面的代码线程安全吗?或者这是不是过早地进行了优化?
- (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...
}
}发布于 2011-03-14 04:12:27
documentation specifically声明:
不可变对象通常是线程安全的;一旦创建了它们,就可以安全地将这些对象传递到线程或从线程传递这些对象。当然,在使用不可变对象时,您仍然需要记住正确使用引用计数。如果您不适当地释放了未保留的对象,则可能会在以后导致异常。
正如hoha所观察到的,因为NSSortDescriptor是不可变的,所以除非特别说明(通常在类文档中),否则它是线程安全的。
发布于 2011-03-14 02:20:50
NSSortDescriptor没有任何可见的方法来改变它,也没有任何理由在内部改变它的状态,所以它很可能是线程安全的(除非苹果在框架代码中对它进行了黑客攻击,我对此表示怀疑)。
至于优化,在没有实际分析的情况下(几乎)总是为时过早。不过,在本例中,我将对static var做同样的事情-主要是为了有一个地方清楚地声明/定义我的排序策略。
https://stackoverflow.com/questions/5291335
复制相似问题