什么是ARC?
ARC即Automatic Reference Counting,它是現(xiàn)有的Objective-C的內(nèi)存管理機制。該機制下,代碼中會自動添加retain/release,原本需要手動處理引用計數(shù)的代碼交由編譯器自動完成。
什么是MRC?
MRC即Manual Reference Counting,手動通過retain為對象獲取內(nèi)存,并用release釋放內(nèi)存。
ARC與Garbage Collection的區(qū)別?
Garbage Collection在運行時管理內(nèi)存,可以解決retain cycle,而ARC在編譯時管理內(nèi)存。
循環(huán)引用?
循環(huán)引用是指兩個或兩個以上對象相互之間互相強引用,導(dǎo)致所有對象無法被釋放的現(xiàn)象。是內(nèi)存泄漏的一種情況。實際使用中,最為常見的是block的應(yīng)用。
關(guān)鍵詞,引用類型?
strong:表示指向并擁有該對象。其修飾的對象的引用計數(shù)會+1.該對象只要引用計數(shù)不為0,就不會被銷毀??梢酝ㄟ^強行設(shè)為nil進(jìn)行銷毀。
weak:表示指向但不擁有該對象。其修飾的對象引用計數(shù)不會增加,會自行在內(nèi)存中被銷毀。使用較多的是定義一個代理。
assign:主要用于修飾基本數(shù)據(jù)類型,如int、float,這些值主要存在于棧中。
copy:與strong類似。不同的是strong的復(fù)制是多個指針指向同一個地址,而copy的復(fù)制會在內(nèi)存中復(fù)制一份對象,指針是指向不同的地址。copy一般用在修飾有對應(yīng)可變類型的不可變對象上,類似NSString
weak一般用于修飾對象,assign一般用來修飾基礎(chǔ)數(shù)據(jù)類型。原因就是assign修飾的對象被釋放后,指針的地址依然存在,造成“野指針”,在堆上容易造成奔潰。而棧上的內(nèi)存系統(tǒng)會自動釋放,不會造成“野指針”。
在Objective-C中,基本數(shù)據(jù)類型默認(rèn)的關(guān)鍵字是atomic,readwrite和assign;普通屬性的默認(rèn)關(guān)鍵字是atomic,readwrite和strong。
atomatic和nonatomic的比較?
atomatic修飾的對象能保證setter和getter的完整性,任何線程訪問它都可以得到一個完整的初始化的對象。但因為要保證操作的完成,所以速度較慢。比nonatomic安全,但也不是絕對的線程安全。
nonatomic修飾的對象不保證setter、getter的完整性,所以,當(dāng)多個線程訪問它的時候,他可能會返回一個未初始化的對象。所以,相較atomatic而言,速度更快,線程也是不安全的。