swift的類型有哪些磨隘?
??swift的類型分為值類型和引用類型兩種缤底。值類型在傳遞和賦值時(shí)將進(jìn)行復(fù)制顾患,而引用類型只會(huì)使用引用對(duì)象的于個(gè)"指向"。swift中定義的很多類型都是值類型个唧,如struct江解、enum以及所有的內(nèi)建類型(Int、Bool徙歼、String犁河、Array、Dictionary)都是值類型魄梯。class為引用類型桨螺。
為什么使用值類型?
??相對(duì)于傳統(tǒng)的引用類型來(lái)說(shuō)酿秸,值類型的一個(gè)顯而易見的優(yōu)點(diǎn)就是減少堆上的內(nèi)存分配和回收次數(shù)灭翔。而且swift中的值類型,特別是array和dictionay這種容器辣苏,在內(nèi)存管理上都經(jīng)過(guò)精心設(shè)計(jì)肝箱。值類型的一個(gè)特點(diǎn)是在傳遞和賦值時(shí)進(jìn)行復(fù)制,而每次復(fù)制必定會(huì)產(chǎn)生額外開銷稀蟋,但是在swift中這個(gè)消耗會(huì)被控制在最小范圍內(nèi)煌张,在沒有必要復(fù)制的時(shí)候,值類型的復(fù)制并沒有發(fā)生糊治。也就是說(shuō)唱矛,簡(jiǎn)單的賦值和參數(shù)的傳遞等普通操作,就算用不同的名字來(lái)回設(shè)置和傳遞值類型井辜,但是在內(nèi)存上它們都是一樣的绎谦。比如下面這段代碼:
func test(array: [Int]) {
for i in array {
print(i)
}
}
var a = [1, 2, 3]
var b = a
var c = b
test(a)
??這段代碼直到運(yùn)行結(jié)束,其實(shí)只在a數(shù)組初始化時(shí)發(fā)生了內(nèi)存分配粥脚,而之后的b窃肠、c甚至傳遞到test方法中的數(shù)組都沒有發(fā)生內(nèi)存分配,它們都指向棧上的同一塊內(nèi)存空間刷允。這個(gè)過(guò)程對(duì)于數(shù)組來(lái)說(shuō)冤留,只發(fā)生了指針移動(dòng),完全沒有新增堆內(nèi)存的分配和釋放問題树灶,效率上更加高效纤怒。前面我們說(shuō)值類型在賦值和傳遞時(shí)會(huì)發(fā)生復(fù)制,是不是swift中就不復(fù)制了呢天通,我們看下面這段代碼:
var a = [1, 2, 3]
var b = a
b.append(4)
??當(dāng)b數(shù)組append執(zhí)行完后泊窘,此時(shí)值復(fù)制就是必須的了,之后將重新為b分配內(nèi)存,a和b將分屬于不同的內(nèi)存烘豹。極大的優(yōu)化了內(nèi)存的使用效率瓜贾。
什么時(shí)候不使用swift內(nèi)置的array和dictionary,而使用NSMutableArray 和 NSMutableDictionary?
??雖然將數(shù)組和字典設(shè)計(jì)為值類型最大的考慮是為了線程安全携悯,但是這樣的設(shè)計(jì)在存儲(chǔ)的元素或條目數(shù)量較少時(shí)祭芦,給我們帶來(lái)了另一個(gè)優(yōu)點(diǎn),即非常高效憔鬼,而"一但賦值就不太會(huì)變化"這種使用場(chǎng)景在Cocoa框架中并不少見龟劲,這有效的減少了內(nèi)存的分配和回收。但是在一些少數(shù)情況下逊彭,數(shù)組或字典中存儲(chǔ)了很多東西咸灿,并且還要對(duì)其中的東西進(jìn)行添加或刪除,這時(shí)如果依舊使用swift內(nèi)建的值類型容器就不太適合了侮叮,它會(huì)在每次操作時(shí)都復(fù)制一遍,即便存儲(chǔ)的都是引用類型悼瘾,在復(fù)制時(shí)我們也需要存儲(chǔ)大量的引用囊榜,這個(gè)開銷也不容忽視,這個(gè)時(shí)候最好使用NSMutableArray 和 NSMutableDictionary亥宿。
??所以卸勺,總結(jié)下來(lái)使用數(shù)組、字典的最佳實(shí)踐是:根據(jù)具體的數(shù)據(jù)規(guī)模和操作特點(diǎn)來(lái)決定是使用值類型容器還是引用類型容器:在需要處理大量數(shù)據(jù)并且頻繁操作其中元素時(shí)烫扼,選擇NSMutableArray 和 NSMutableDictionary會(huì)更好曙求;而對(duì)于容器內(nèi)條目小而容器本身數(shù)目多的情況,則應(yīng)該使用swift內(nèi)建的array和dictionary映企。