當前位置:成語大全網 - 新華字典 - iOS 容器

iOS 容器

本次我們來聊聊iOS開發中的數據容器,主要從內測管理的角度來分析。從內測管理區別上可以分為兩類。

強類型的容器主要有

NSArray,NSMutableArray,NSSet,NSMutableSet,NSDictionary,NSMutableDictionary 。

若類型的容器主要有

NSMapTable,NSHashTable,NSPointerArray 。

強類型的容器會對其持有的對象引用計數加1,弱引用的容器不會增加容器裏面對象的引用計數。

強引用類型的容器大家應該很熟悉了,本次我們主要來聊聊iOS中弱引用數組。

NSMapTable 是在 NSDictionary 之後的壹個可變集合模型化的類 , 主要特點是在存入數據的時候可以設置對象為weak引用,key 可以不用遵循 NSCopying 協議;key 和 value 的內存管理方式可以分開,如:key 是強引用,value 是弱引用;

它們具有以下區別:

妳可以將 NSMapTable 實例配置為對任意指針進行操作,而不僅僅是對象,鼓勵使用 C 的 API: void * 指針來操作。 基於對象的 API(例如 setObject:forKey :)將無法在不進行類型轉換的情況下對無對象指針操作。

配置映射表時,請註意,只有NSMapTableOptions中列出的選項才能保證其余的API能夠正常工作,包括復制,歸檔和快速枚舉。雖然其他NSPointerFunctions選項用於某些配置,例如保留任意指針,但並不是所有選項的組合都有效。使用某些組合時映射表可能無法正常工作,甚至可能無法正確初始化。

創建方法

通過指定的選項來初始化NSMapTable對象;

keyOptions:壹個位域,用於指定地NSMapTable中的鍵的選項。

valueOptions:壹個位域,用於指定地NSMapTable中的值的選項

initialCapacity:NSMapTable的初始容量。 這只是壹個提示; 隨後可以根據需要增加和縮小NSMapTable。

用來指定NSMapTable對象中元素(鍵和值)的行為的常量。

NSHashTable類似於NSSet,特別的是支持弱引用。區別如下:

妳可以將 NSHashTable 實例配置為對任意指針進行操作,而不僅僅是對象,鼓勵使用 C 的 API: void * 指針來操作。基於對象的 API(例如 addObject:)將無法在不進行類型轉換的情況下對無對象指針操作。

由於它的壹些選項,NSHashTable不是壹個集合,因為它可以有不同的行為(例如,如果指定了兩個isEqual:相等的字符串可能都被添加)。

配置NSHashTable時,請註意,只有NSHashTableOptions中列出的選項才能保證其余的API能正常工作,包括復制,歸檔和快速枚舉。 雖然其他NSPointerFunctions選項用於某些配置,例如保留任意指針,但並不是所有選項的組合都有效。 使用某些組合,NSHashTable可能無法正常工作,甚至可能無法正確初始化。

根據使用的屬性來初始化NSHashTable;

options:NSHashTable裏面元素的支持的選項;

initialCapacity:NSHashTable可以容納的元素的初始數量。

NSPointerArray是以NSArray為模型的,增加了內存管理策略。可以存放nil。

我們先來了解下NSPointerFunctionsOptions & NSPointerFunctions

NSPointerFunctions 是用來自定義容器對象壹些action,入判等,大小等

NSPointerFunctionsOptions

NSPointerFunctionsOptions,它是個 option,主要分為三大類:

內存管理

NSPointerFunctionsStrongMemory:默認值,強引用成員

NSPointerFunctionsZeroingWeakMemory:已廢棄,在 GC 下,弱引用指針,防止懸掛指針

NSPointerFunctionsMallocMemory 與 NSPointerFunctionsMachVirtualMemory: 用於 Mach 的虛擬內存管理

NSPointerFunctionsWeakMemory:弱引用成員

特性,用於標明對象判等方式

NSPointerFunctionsObjectPersonality:hash、isEqual、對象描述

NSPointerFunctionsOpaquePersonality:pointer 的 hash 、直接判等

NSPointerFunctionsObjectPointerPersonality:pointer 的 hash、直接判等、對象描述

NSPointerFunctionsCStringPersonality:string 的 hash、strcmp 函數、UTF-8 編碼方式的描述

NSPointerFunctionsStructPersonality:內存 hash、memcmp 函數

NSPointerFunctionsIntegerPersonality:值的 hash

內存標識

NSPointerFunctionsCopyIn:根據第二類的選擇,來具體處理。如果是 NSPointerFunctionsObjectPersonality,則根據 NSCopying 來拷貝。

所以在使用時,可以多個組合,比如:需要強引用成員、使用對象方式對比、並且 add 時 copy 對象