標籤:
obj中建立新對象有兩種方式:[classname new]和[[classname alloc] init]。兩種方法等價,Cocoa慣例是使用alloc和init。
1.指派至:
allocation是一個新對象誕生過程,從OS獲得一塊記憶體並指定為存放對象的執行個體變數的位置。同時alloc方法還將這塊記憶體地區全部初始化為0。BOOL初始化為NO,int初始化為0,float初始化為0.0,指標初始化為nil。
然後init初始化之後才能使用,C++和Java中使用建構函式在單次操作中執行對象的分配和初始化,Objective-C將兩個操作分開。
2.Car *car = [[Car alloc] init];
-(id)init
{
if(self=[super init])
{
engine=[Engine new];
tires[0]=[Tire new];
}
}
-(id)init傳回值,id可表不同的對象。init可以接受參數並可能判斷返回另外一個類的對象可能更合適。比如從一個很長的字串生產一個新的字串。
if(self=[super init]) 首先的是[super init],使超類完成自己的初始化工作。使超類執行所需任何操作,以便對象能響應訊息並處理保留計數器。執行個體變數所在的記憶體位置到隱藏的self的距離是固定的,如果init方法返回一個新對象,則需要更新self,以便之後的執行個體變數的引用能映射到正確的記憶體位置,self=[super init]賦值就是這個作用,隻影響init方法中self的值,不影響init範圍以外的內容。初始化一個對象出錯時,返回nil。if(self=[super init])典型的C風格,一般不採用self=[super init] if(self)...
在car的初始化中給執行個體變數賦值並建立car所需要的engine和tires對象。可以一次建立所有所需要的對象,使得Car類可以[[Car alloc] init]之後可以立即使用;也可以先為engine對象和tire對象預留位置,等調用者需要的時候再建立對象,惰性求值(lazy evaluation)。
3.便利初始化函數。
為了減少工作麻煩,很多個物件有多個init開頭的方法。NSString類為例子:
NSString *emptyString = [[NSString alloc] init];
NSString *str = [[NSString alloc] initWithFormat:@"%d or %d",2,33];
NSString *str = [[NSString alloc] initWithContentsOfFile:@"/tmp/1.txt"];
Xcode提供的自動匹配功能非常使用,輸入init按esc鍵後會顯示所有的可以匹配的函數。
所有使用alloc,copy,new方法建立的對象,只用完成之後都需要釋放。[str release];
NSString *str = [NSString stringWithFormat:@"%.1f",20.0]; str這裡是可以自動釋放的,當自動釋放池銷毀時,該字串對象也被清理。
一般在main函數首先建立自動釋放池,為自動釋放的對象在等待自動釋放池被銷毀時提供容身之所:
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
在程式結束時,pool釋放,並向池中的所有對象發送release訊息:
[pool release];
4.指定初始函數
我們可以自己編寫方便的便利初始化函數,並且可以編寫多個。但必須指定某個初始化方法為指定初始化函數,該類的所有初始化方法使用指定初始化函數執行初始化操作。子類使用其超類的指定初始化函數實現超類的初始化。如果構造了一個初始化函數,需要在自己的指定初始化函數中調用超類的指定初始化函數。如果不指定初始化函數,那麼該類子類可能需要重寫所有的它的初始化函數。
Objective-C基礎學習筆記——對象初始化