初始化之alloca,init問題
初始化之alloca,init問題
文章開始把我喜歡的這句話送個大家:這個世界上還有什麼比自己寫的程式碼執行在一億人的電腦上更酷的事情嗎,如果有那就是讓這個數字再擴大十倍
經常看到NSString *name=[[NSString alloc] init] 分配記憶體空間,一直在用,從來沒考慮過它的內部是怎麼實現的.無意中看到了這一句程式碼
NSString *name=[NSString alloc];
NSLog(@"%p",name);
name=[name init];
NSLog(@"%p",name);
列印了一下,發現兩個的記憶體地址不一樣:
LessonMRC2[1222:303] 0x100203850
LessonMRC2[1222:303] 0x7fff73ada7b8
alloc是開闢一個記憶體空間,init是初始化,為什麼初始化不在原有的記憶體空間上初始化,而是重新開闢一個記憶體空間?????
下面的程式碼:
NSObject *obj=[NSObject alloc];
NSLog(@"%p",obj);
obj = [obj init];
NSLog(@"%p",obj);
列印之後:
LessonMRC2[1232:303] 0x100103730
LessonMRC2[1232:303] 0x100103730
地址卻一樣了
對於NAArray:
NSArray *name=[NSArray alloc];
NSLog(@"%p",name);
name=[name init];
NSLog(@"%p",name);
列印:
LessonMRC2[1244:303] 0x100103740
LessonMRC2[1244:303] 0x100102f50
仍然是不一樣的.
原因是什麼哪?在NSStrng的init方法中可以找到答案:
-(id)init
{
if(self=[super 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重新分配空間這一環節
加油吧,程式設計師!