當前位置:成語大全網 - 書法字典 - iOS陣列的實現原理

iOS陣列的實現原理

無論是NSArray還是nsmutablearray,在alloc之後的都是_ _ NSPlacrholderArray。

當我們排列壹個空數組時,我們得到__NSArray0。

當nsarray只有壹個元素時,得到_ __NSSingleObjectArrayI。

nsarray.count & gt1,妳得到_ _ NSArrayI。

Nsmutablearray返回_ _ NSArrayM。

占位符和占位符有相同的內存地址,這意味著它是單例的。這個類中只有壹個ISA指針,在init之後被壹個新的實例代替。

CFArray在CoreFoundation中,對應的是Foundation中的NSArray。它們是由免費電話使用的環形緩沖區實現的。

C數組的原理是連續內存空間。當壹個元素被插入下標0時,它後面的所有元素都被移動,也就是memmove原理。

移除第壹個元素需要相同的操作。

環形緩沖區,刪除時指針會不清晰。如果我們在中間插入和刪除,我們只會移動最少的邊元素。

_ _ NSArrayI {

NSInterger _ userd數組中元素的數量。調用[array count]時,返回_userd的值。

id _ list[0];將它用作id_list,即用於存儲id對象緩沖區。因為_ _ NSArrayI是不可變的,所以壹旦分配了_list,在釋放之前不會有任何移動和刪除。

}

從實現的角度來說,如果_list還沒有形成循環,那麽所有的元素都會在第壹時間得到,就像__NSArrayI壹樣。但如果_list構成壹個幻境,則需要兩次,第壹次獲取從_offset到_list末尾的元素,第二次獲取存儲在_list開頭的剩余元素。

__NSArrayM的_list是壹個循環數組,實際上是用_offset標識的。

forin最快的原因是它遵循NSFastEnumertation協議,該協議直接從C數組中移除對象。對於變量數組,最多只需要兩次就可以得到所有的數據。如果數組沒有形成壹個循環,那麽第壹次會得到所有的元素。就像壹個不可變數組,如果數組形成壹個循環,就需要兩次,第壹次獲取對象數組起點偏移到循環數組末尾的元素,第二次獲取循環數組開頭存儲的剩余元素。for循環較慢的原因是每次都調用objectAtIndex:添加@autoreleasepool可以提高效率。如果每次遍歷都不需要知道下標,那麽選擇forin。

NSEnumerationConcurrent+Block的方法最耗時。我認為是因為它使用了多線程。就這個方法而言,多線程的優勢不在於它遍歷的速度有多快,而在於它的回調是在每個子線程中。