2014-04-16 37 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表示「在大多數情況下,只要您一次只從一個線程使用它們,就可以從任何線程使用這些類。」

因此,就你而言,你不應該做你想做的事情。