天天看點

iOS 基礎04--Foundation架構下基本集合類

iOS 基礎04—Foundation架構下基本集合類

不可變集合的最大好處是線程安全。

1、常用基本集合類:

以下三種是最常用的集合類型:

  • NSArray:有序的(所謂有序,即對象的順序是按照添加順序來儲存的),有重複對象;對應的可變數組NSMutableArray
  • NSDictionary:字典、鍵值對,對應的可變字典NSMutableDictionary
  • NSSet:它就相當于一個無序的(是以不能使用下标來查找元素,隻能使用循環周遊擷取資料或者擷取一個随機資料)、沒有重複對象的NSArray;對應的可變集合NSMutableSet ,

    另外還有一個:

  • NSCountedSet,它也是NSSet的可變類型,隻是它可以統計每個元素出現的個數:
let a = NSSet(objects: 1,2,3,1,2,4)
print(a) //3,2,1,4 列印的結果是無序且無重複的

let b = NSMutableSet(objects: 1,2,3,1,2,4)
print(b) //3,2,1,4

let c = NSCountedSet(objects: 1,2,3,1,2,3,4)
print(c) //3,2,1,4
print(c.count(for: 1)) //2
           

以上三種集合都是隻能存儲對象,不能存儲基本資料類型。是以想要存儲基本資料類型就得先把基本資料類型封裝成對象——NSNumber。同樣的,集合中也不能存儲nil,如果要存儲空對象,則使用NSNull把null封裝成一個對象。

2、非常用存儲弱類型集合類:

NSArray、NSDictionary、NSSet存儲OC對象時,對其中的元素都是強引用(包括key和value值),如果要存儲一個弱引用類型的值或者使用一個沒有實作coping協定的object作為NSDictionary的key,怎麼辦?即使用弱類型集合類:

以下三個類預設都是可變的

  • NSPointerArray:類似NSArray。可存儲NULL,也可以用來存儲weak元素,weak元素釋放之後,對應的位置自動變成NULL,使用count時,也會将NULL元素包含進來。
  • NSMapTable:類似NSDictionary,隻是其key和value都可以是weak類型,當weak的key和或weak的value被釋放掉,則key-value鍵值對即被移除:
let c = NSMapTable(keyOptions: NSPointerFunctions.Options.weakMemory, valueOptions: NSPointerFunctions.Options.strongMemory) //key是弱引用的,value是強引用的
           
  • NSHashTable:類似NSSet,但是是可變的,可以存放weak類型:
let a = NSHashTable(options: NSPointerFunctions.Options.strongMemory) //這樣就和NSSet沒有差別

let b = NSHashTable(options: NSPointerFunctions.Options.weakMemory) //這樣就可以存儲weak類型
           

3、非常用集合類:

  • NSEnumerator:疊代器,(NSArray、NSDictionary、NSSet)都能傳回NSEnumerator類型對象,它的nextObject可以周遊每個集合元素,最後傳回nil。可以通過與while結合周遊集合每個元素:
let a = NSSet(objects: 1,2,3,1,2,4)
print(a) //3,2,1,4 列印的結果是無序且無重複的

let enumerator = a.objectEnumerator()
while let item = enumerator.nextObject() {
print(item)
}
           
  • NSIndexPath、NSIndexSet:UItableviewcell的下标集合

4、特殊的集合NSCache

  • NSCache:類似NSMutableDictionary,但是預設是可變且線程安全的。它會對記憶體警告做出反應清理自己。

可以去github上檢視Demo,喜歡的話star一下哦

[github](https://github.com/FCF5646448/WeakNetManagerSwift)

[CSDN](https://blog.csdn.net/u012297622)