OC 中new與alloc init的區別

2021-07-10 16:30:03 字數 1085 閱讀 2573

英文詳解:

1.在實際開發中很少會用到new,一般建立物件咱們看到的全是[[classname alloc] init]

但是並不意味著你不會接觸到new,在一些**中還是會看到[classname new],

還有去面試的時候,有時候會被問到這個問題。

2.那麼,他們兩者之間到底有什麼區別呢

我們看原始碼:

new 

//而 alloc/init 像這樣:

+ alloc 

- init 

通過原始碼中我們發現,[classname new]基本等同於[[classname alloc] init];

區別只在於alloc分配記憶體的時候使用了zone.

這個zone是個什麼東東呢?

它是給物件分配記憶體的時候,把關聯的物件分配到乙個相鄰的記憶體區域內,以便於呼叫時消耗很少的代價,提公升了程式處理速度;

3.而為什麼不推薦使用new?

不知大家發現了沒有:如果使用new的話,初始化方法被固定死只能呼叫init.

而你想呼叫init***怎麼辦?沒門兒!據說最初的設計是完全借鑑smalltalk語法來的。

傳說那個時候已經有allocfromzone:這個方法,

但是這個方法需要傳個引數id mycompanion = [[theclass allocfromzone:[self zone]] init];

這個方法像下面這樣:

+ allocfromzone:(

void

*) z 

//後來簡化為下面這個:

+ alloc 

但是,出現個問題:這個方法只是給物件分配了記憶體,並沒有初始化例項變數。

是不是又回到new那樣的處理方式:在方法內部隱式呼叫init方法呢?

後來發現「顯示呼叫總比隱式呼叫要好」,所以後來就把兩個方法分開了。

概括來說,new和alloc/init在功能上幾乎是一致的,分配記憶體並完成初始化。

差別在於,採用new的方式只能採用預設的init方法完成初始化,

採用alloc的方式可以用其他定製的初始化方法。

原文:

OC 中new與alloc init的區別

1.在實際開發中很少會用到new,一般建立物件咱們看到的全是 classname alloc init 但是並不意味著你不會接觸到new,在一些 中還是會看到 classname new 還有去面試的時候,也很可能被問到這個問題。2.那麼,他們兩者之間到底有什麼區別呢 我們看原始碼 new 而 al...

OC 中new與alloc init的區別

英文詳解 1.在實際開發中很少會用到new,一般建立物件咱們看到的全是 classname alloc init 但是並不意味著你不會接觸到new,在一些 中還是會看到 classname new 還有去面試的時候,也很可能被問到這個問題。2.那麼,他們兩者之間到底有什麼區別呢 我們看原始碼 new...

java中的new與newInstance區別

newinstance例子 string classname 類名稱 class classxml class.forname classname domxml dx domxml classxml.newinstance string classname domxml class classxml...