Objective-C 初始化

來源:互聯網
上載者:User

標籤: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 初始化

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.