Objective C中的alloc和init問題

2021-09-23 21:02:26 字數 1435 閱讀 1023

從開始學的nsstring *name=[[nsstring alloc] init] 起,僅僅這句話是分配記憶體空間,一直在用,從來沒考慮過它的內部是怎麼實現的。今天無意中看到了這一句**:

nsstring *name = [nsstring alloc];

nslog(@"%p",name);

name = [name init];

nslog(@"%p",name);

alloc是開闢乙個記憶體空間,init是初始化,為什麼初始化不在原有的記憶體空間上初始化,而是重新開闢乙個記憶體空間。

於是開始查資料,這時又發現了乙個新的迷惑:

nsobject *obj = [nsobject alloc];

nslog(@"%p",obj);

obj = [obj init];

nslog(@"%p",obj);

列印結果:

怎麼位址又變一樣了?

再列印nsarray的試一試:

nsarray *person = [nsarray alloc];

nslog(@"%p",person);

person = [person init];

nslog(@"%p",person);

再次列印結果:

仍然是不一樣的。

原因是什麼呢?

首先看看nsstrng的init方法吧:

-(id)init

}

從**中可以分析,self=[super init]如果不為nil,就重新分配記憶體空間,這就解釋了為什麼 nsstring,nsarray的呼叫alloc]init]方法後,記憶體位址會不一樣,但是nsobject為什麼會一樣呢,我們知道nsobject是一切類的基類,當[[nsstring alloc]init]執行時,呼叫的[super init]就是 nsobject中的init方法,既然nsobject身為基類,它也就無法呼叫super init,所以當nsobject執行[[nsobject alloc]init]時,也就沒有了init重新分配空間這一環節。

至於蘋果公司為什麼初始化乙個例項要分兩步,個人認為是方便構造後初始化不同的方法,如果用 new關鍵字,只能呼叫乙個init,而不能呼叫initwithname等方法。

知識拓展:

nsstring  alloc之後,沒有init,那麼這部分alloc後的記憶體空間可不可以用?答案是顯而易見的,如果可以用,蘋果公司也就沒必要提供乙個init方法,那麼alloc後的指標稱為什麼呢? 懸掛指標。 

如果乙個地方指標既不為空,也沒有被設定為指向乙個已知的物件,則這樣的指標稱為懸掛指標。在程式裡面是很危險的事。當程式執行使用該指標時,程式不能判斷指標的合法性,將會產生很嚴重的錯誤。

python中模組的 all

python模組中的 all 屬性,可用於 模組匯入時限制,如 from module import 此時被匯入模組若定義了 all 屬性,則只有 all 內指定的屬性 方法 類可被匯入。若沒定義,則匯入模組內的所有公有屬性,方法和類 kk.py class a def init self,name...

C linq中的all方法

確定是否對序列中的所有元素都滿足條件。返回乙個bool型別。一定要注意是所有的元素都要滿足才會返回true,只要有乙個元素不滿足就返回false 關於返回值為啥是bool,可以看一下關於func的解讀。宣告乙個int型別的陣列 int ints 判斷陣列的每乙個值是否都小於11 bool zc in...

python中模組的 all

python模組中的 all 屬性,可用於模組匯入時限制,如 from module import 此時被匯入模組若定義了 all 屬性,則只有 all 內指定的屬性 方法 類可被匯入。若沒定義,則匯入模組內的所有公有屬性,方法和類 kk.py all a func 在別的模組中,匯入該模組時,只能...