2014-04-16 106 views
1

我知道NSMutableArray不应该被信任为线程安全的,但是如果我只打电话[array addObject:object]我没有以任何其他方式访问阵列NSMutableArray的addObject方法是线程安全的吗?

例如:

NSMutableArray* array = [[NSMutableArray alloc] init]; 
[self.subviews 
    enumerateObjectsWithOptions:NSEnumerationConcurrent 
    usingBlock:^(UIView* view, NSUInteger idx, BOOL *stop) { 
    if ([self methodThatReturnsBool:view]) [array addObject:view]; 
    }]; 

感谢您的咨询! :)

+1

我不同意。我具体询问'addObject:',而不是整个'NSMutableArray'类。但我可以明白为什么你能这样想,因为两者的答案都是一样的(尽管我不确定这是否属实,这就是我问这个问题的原因)。我以前读过这个问题的答案,这对我来说还不够。 – aleclarson

回答

2

NSMutableArray不保证是线程安全的 - 甚至不只是添加对象,因为使线程安全需要addObject:是一个原子操作,它不是类的合约的一部分。

一般来说,如果文档中提到“这是线程安全的”,它是线程安全的(至少是孤立的),但是如果文档没有这样说,你应该认为它是不安全的,而且你需要使用同步。

1

正如Bryan Chen所指出的那样,NSEnumerationConcurrent线程将导致该块在“同一时间”在不同的线程上运行。修改NSMutableArray无法在不同的线程中同时完成。

Apple的说明文件https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-SW1表示“在大多数情况下,只要您一次只从一个线程使用它们,就可以从任何线程使用这些类。”

因此,就你而言,你不应该做你想做的事情。