ios中alloc init new的區別

2021-08-13 09:52:48 字數 1102 閱讀 1523

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的方式可以用其他定製的初始化方法。

IOS中UIViewController的建立

self.window uiwindow alloc initwithframe uiscreen mainscreen bounds self.window.backgroundcolor uicolor whitecolor self.window makekeyandvisible retur...

IOS開發中如何區分IOS版本

當前系統支援的最小版本 iphone os version min required 當前系統支援的最大版本 iphone os version max allowed 比如用iphone os sdk 3.1.2 編譯的程式 iphone os version min required iphon...

ios中讀寫檔案

在ios的開發中,經常遇到要讀寫檔案的情況,例如處理 採集資訊等,那麼在ios中對檔案的讀寫有兩種方式 1 使用nsdata 來將整個資料讀取到記憶體中 將檔案寫到檔案中 使用這種方式比較適合針對小檔案的讀寫,可以全部的讀到記憶體中處理,比如說全域性性的配置檔案等。2 使用c的api來讀取 在ios...