- new做了三件事情
1.開(kāi)辟存儲(chǔ)空間 + alloc 方法
2.初始化所有的屬性(成員變量) - init 方法
3.返回對(duì)象的地址
Person *p = [Person new];
// alloc做了什么事情: 1.開(kāi)辟存儲(chǔ)空間 2.將所有的屬性設(shè)置為0 3.返回當(dāng)前實(shí)例對(duì)象的地址
Person *p1 = [Person alloc];
// 1.初始化成員變量, 但是默認(rèn)情況下init的實(shí)現(xiàn)是什么都沒(méi)有做 2.返回初始化后的實(shí)例對(duì)象地址
Person *p2 = [p1 init];
// [[Person alloc] init];
// 注意: alloc返回的地址, 和init返回的地址是同一個(gè)地址
NSLog(@"p1 = %p, p2 = %p", p1, p2);
// [[Person alloc] init]; == [Person new];
// 建議大家以后創(chuàng)建一個(gè)對(duì)象都使用 alloc init, 這樣可以統(tǒng)一編碼格式
Person *p3 = [[Person alloc] init];
new
This method is a combination of alloc and init. Like alloc, it initializes the isa instance variable of the new object so it points to the class data structure. It then invokes the init method to complete the initialization process.可以把new方法拆開(kāi)如下:
(1)調(diào)用類(lèi)方法+alloc分配存儲(chǔ)空間,返回未經(jīng)初始化的對(duì)象Person *p1 = [person alloc];
(2)調(diào)用對(duì)象方法-init進(jìn)行初始化,返回對(duì)象本身 Person *p2=[p1 init];
(3)以上兩個(gè)過(guò)程整合為一句:Person *p=[[Person alloc] init];
說(shuō)明:
alloc 與 init合起來(lái)稱(chēng)為構(gòu)造方法砾隅,表示構(gòu)造一個(gè)對(duì)象alloc 方法為對(duì)象分配存儲(chǔ)空間桐经,并將所分配這一塊區(qū)域全部清0.
The isa instance variable of the new instance is initialized to a data structure that describes the class; memory for all other instance variables is set to 0.init方法是初始化方法(構(gòu)造方法)侥锦,用來(lái)對(duì)象成員變量進(jìn)行初始化,默認(rèn)實(shí)現(xiàn)是一個(gè)空方法波俄。
An object isn’t ready to be used until it has been initialized. The init method defined in the NSObject class does no initialization; it simply returns self.所以下面兩句的作用是等價(jià)的
Person *p1 = [Person new];
Person *p = [[Person alloc] init];
iOS 程序通常使用[[類(lèi)名 alloc] init] 的方式創(chuàng)建對(duì)象,因?yàn)檫@個(gè)可以與其他initWithXX:...的初始化方法疹蛉,統(tǒng)一來(lái)靴姿。代碼更加統(tǒng)一