堆與棧的區(qū)別
一、堆??臻g分配區(qū)別:
1、棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧;
2、堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收,分配方式倒是類似于鏈表。
二、堆棧緩存方式區(qū)別:
1、棧使用的是一級緩存, 他們通常都是被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放;
2、堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。
三、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進后出的數(shù)據(jù)結(jié)構(gòu)。
instancetype和id的區(qū)別
區(qū)別1:
在ARC(Auto Reference Count)環(huán)境下:
instancetype用來在編譯期確定實例的類型,而使用id的話,編譯期不檢查類型, 運行時檢查類型.
在MRC(Manual Reference Count)環(huán)境下:
instancetype和id一樣,不做具體類型檢查
區(qū)別2:
id可以作為方法的參數(shù),但instancetype不可以
instancetype只適用于初始化方法和便利構(gòu)造器的返回值類型
MRC與ARC的區(qū)別
ARC:自動管理內(nèi)存計數(shù)器。不需要程序員管理內(nèi)存,編譯器會在恰當?shù)臅r候給我們填上reatin、release等代碼。
注意:oc中的ARC和JAVa里面的垃圾回收機制不太一樣,Java中的垃圾回收機制是系統(tǒng)幫忙干的,而oc中的ARC是編譯器干的。
ARC是編譯器特性(編譯器會在恰當?shù)臅r候給我們填上reatin、release等代碼),不是運行時特性。
MRC:手動管理內(nèi)存計數(shù)器。需要程序要自己恰當?shù)牡胤阶约簩懮蟫elease和retain代碼。
野指針和空指針的區(qū)別
野指針:表示指針指向了一個被釋放的對象,也稱“僵尸對象”。只要給野指針發(fā)送消息,程序就會報錯。
空指針:指向沒有儲存控件的指針(就是指針設(shè)置為nil)。我們一般為了避免給野指針發(fā)送消息,當一個對象被釋放后我們都將這個對象的指針設(shè)置為空指針。給空指針發(fā)送消息不會報錯
property修飾符
readonly:只讀的,修飾的屬性只自動生成getter方法
readwrite :可讀可寫的,修飾的屬性可以自動生成getter/setter方法。默認情況下是readwrite
retain:自動幫我們生成getter/setter方法,并且生成的是內(nèi)存管理代碼(引用計數(shù)器+1)。
assign:不會自動幫助我們在setter/getter方法中生成內(nèi)存管理代碼,僅僅生成普通的getter與setter方法
getter:可以給getter方法起一個名字
setter:可以給setter方法起一個名字
atomic:原子性,性能比較低,安全性高。(只能執(zhí)行一條線程)
nonatomic:非原子性,性能比較高,安全性比較差 (可以同時進行多條線程)
+(void)load和+(void)initialize的區(qū)別
+(void)load:表示程序開始加載到內(nèi)存時調(diào)用? ? 2.自身未定義,不會沿用父類的方法。3.類別中的定義全部執(zhí)行,先執(zhí)行類自身的實現(xiàn),再執(zhí)行類別(Category)中的實現(xiàn)
+(void)initialize:便是該類第一次使用將被調(diào)用? 2.自身未定義,hui沿用父類的方法。3.類別中的定義,會執(zhí)行最后一個,并且覆蓋類的方法
weak和strong assign
strong:強引用,用于OC對象,相當于MRC中的reatin,引用計數(shù)器加1
weak:弱引用,用于OC對象,相當于MRC中的assign,引用計數(shù)器不加1
assign:用于一般數(shù)據(jù)類型,和MRC中的assign一樣,引用計數(shù)器不加1