copy on write(COW) 集合的copy

//main thread

self.arr = @[@1, @2, @3].mutableCopy;

for (int i = 0; i < _arr.count; i ++) {

NSLog(@"element: %@", _arr[i]);

}

//thread 2

NSMutableArray* localArr = self.arr;

//get result from server

NSArray* results = @[@8, @9, @10];

//refresh local arr

[localArr removeAllObjects];

[localArr addObjectsFromArray:results];

arr初始化之后,以64位系統為例,其實際的內存布局分為三塊:第一塊是指針NSMutableArray* arr所處的位置,為8個字節。第二塊是數組實際的內存區域所處的位置,為連續3個指針地址,各占8個字節一共24個字節。第三塊才是@1,@2,@3這些NSNumber對象真正的內存空間。當我們調用不同的API對arr進行操作的時候,要分清楚實際是在操作哪部分內存。

thread 2這行代碼實際上只是新生成了8個字節的第一類內存空間給localArr,localArr實際上還是和arr共享第二塊和第三塊內存區域,當在thread 2執行[localArr removeAllObjects];清理第二塊內存區域的時候,如果主線程正在同時訪問第二塊內存區域_arr[1],就會導致crash了。這類問題的根本原因,還是在對于同一塊內存區域的同時讀寫。

Swift有COW機制,當賦值時,會新生成一個數組實際的內存區域所處的位置,同時讀寫就不會出現問題

OC沒有COW機制就需要我們自己copy,比如:

NSMutableArray* iterateArr = [self.arr copy];

self.arr = @[@1, @2, @3].mutableCopy;

只要是針對共享數組的操作,時刻記得copy一份新的內存區域,就可以實現手動COW的效果,這樣Objective C也能在維護狀態的時候,是多線程安全的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 狀態維護是個怎么說都不夠的話題,畢竟狀態的處理是我們整個App最核心的部分,也是最容易出bug的地方。之前寫過一篇...
    MrPeak閱讀 474評論 3 7
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,200評論 30 471
  • 設計模式是什么? 你知道哪些設計模式,并簡要敘述?設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種類型的事...
    irenb閱讀 5,241評論 1 21
  • 若不能因為孩子放棄離婚,也不能因為孩子包容一切的父母們,你們知道孩子的世界變成什么樣了嘛?
    憶童年0923閱讀 193評論 0 0
  • 這里,絕對是改變我人生的地方。而這里的人,也影響了我對生活,對工作的態度。也讓我認清了自己,有了向往的目標。為什么...
    夏景暄sunny閱讀 232評論 0 0