標籤:objective 記憶體 設定
初始化對象分配記憶體+ (id) alloc;
- 對象的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部執行個體變數,並將其指定為 存放對象的執行個體變數的位置.
- alloc方法同時將這塊記憶體地區全部設定為0.(由於其他語言沒有初始化帶來了很多問題),結果是: BOOL 變數初始值為 NO, 所有的 int 類型變數為0,float 變數為0.0,所有的指標為 nil.
初始化對象- (id) init;
- 初始化的功能就是保障我們的執行個體變數是可用的完整對象,如: 我們在初始化中給類中依賴的其它的執行個體變數賦值
- 有兩種初始化思想.第一種就是初始化方法中將所有相依賴的對象全部建立並賦值,”開箱即用”;第二種是惰性求值,就是在初始化的時候先佔位,在使用的時候,在確認具體的值.這兩種方法需要根據業務來進行取捨.
- 初始化方法的編寫習慣:
- (id)init{ if (self = [super init]){ //do something init content... }}
開箱即用的初始化方式
個人理解就是把初始化的過程放到了方法中,應該說是封裝到了方法中,當使用時,只需要調用此方法就能實現對象的初始化.並且,此時不需要setter,getter 方法的聲明與實現
直接在對應的實現檔案中定義:
- (id)init{ if (self = [super init]) { engine = [[QYEngine alloc] init]; tires = [[NSMutableArray alloc] initWithCapacity:4]; for (int i = 0; i < 4; i++) { QYTire *tire = [[QYTire alloc] init]; [tires addObject:tire]; [tire release]; } } return self;}//開箱即用
調用時也非常簡單,這屆在主函數中調用即可
#import <Foundation/Foundation.h>#import "QYCar.h"#import "QYEngine.h"#import "QYTire.h"int main(int argc, const char * argv[]) { @autoreleasepool { //開箱即用 QYCar *myCar = [[QYCar alloc] init]; NSLog(@"Car info: %@",myCar); [myCar release]; } return 0;}
當然,代碼並不完整,只需要在相應的實現檔案中實現部分列印功能即可
輸出的結果如下
Car info: I am engine,(
“I am tire”,
“I am tire”,
“I am tire”,
“I am tire”
)
2015-06-28 21:26:28.068 InitDemo[2276:1416754] car destory
2015-06-28 21:26:29.251 InitDemo[2276:1416754] engine destory
2015-06-28 21:26:29.251 InitDemo[2276:1416754] tire destory
2015-06-28 21:26:30.187 InitDemo[2276:1416754] tire destory
2015-06-28 21:26:31.621 InitDemo[2276:1416754] tire destory
懶載入初始化方式
感覺懶載入的方式比較麻煩,他不僅需要 setter,getter 方法的聲明和定義,還需要在具體調用時進行現場的初始化方式
懶載入的初始化方式具體實現,在對應的實現檔案中:
//懶載入- (id)init{ self = [super init]; if (self) { tires = [[NSMutableArray alloc] initWithCapacity:4]; for (int i = 0; i < 4; i++) { tires[i] = [NSNull null]; } } return self;}- (void)setEngine:(QYEngine *)newEngine{ [newEngine retain]; [engine release]; engine = newEngine;}- (QYEngine*)engine{ return engine;}- (void)setTire:(QYTire *)newTire atIndex:(NSUInteger)index{ //數組的使用會使tires的引用計數器加1// [newTire retain];// [tires[index] release]; tires[index] = newTire;}- (QYTire*)tireAtIndex:(NSUInteger)index{ return tires[index];}//懶載入
main() 中的代碼也同樣不少,其輸出結果與上面相同.
int main(int argc, const char * argv[]) { @autoreleasepool { //懶載入 QYCar *myCar = [[QYCar alloc] init]; QYEngine *engine = [[QYEngine alloc] init]; [myCar setEngine:engine]; [engine release]; for (int i = 0; i < 4; i++) { QYTire *tire = [[QYTire alloc] init]; [myCar setTire:tire atIndex:i]; [tire release]; } NSLog(@"Car info: %@",myCar); [myCar release]; }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C 初始化