NSMutableArray的addObject方法是否是线程安全的?

时间:2014-04-16 00:47:35

标签: ios objective-c nsmutablearray

我知道NSMutableArray不应该被信任为线程安全的,但如果我只调用[array addObject:object]我不会以任何其他方式访问数组

例如:

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

感谢您的任何建议! :)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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说"在大多数情况下,只要您一次只使用一个线程,就可以从任何线程使用这些类。&#34 ;

所以,在你的情况下,你不应该做你想做的事。