淺析關於ObjectC中的自定義初始化方法和便利構造器以及重寫父類的description方法的理解

            自定義初始化方法和便利構造器以及重寫父類的description方法三種方法的使用在ObjectC中應用非常廣泛,但是之前一直對於這3種方法的使用出現差錯,現將這三種常見方法進行一個簡單地梳理,以便加深理解。
=========================================================================================
1.指定初始化方法是對父類的init方法實現的重載,沒必要在.h文件中進行聲明,此方法被本類中其他方法調用。
.m文件
- (instancetype)initWithName: (NSString *)name

                         gender: (NSString *)gender

                             ID: (int)ID{

     // 本類中變量初始化

   if ([superinit]) {//也可以self = [self init],以便被本類中其他方法(init方法)調用。此處self執行的是該方法的對象

        //直接賦值的方式,並沒有考慮該實例變量的語義設置,所以也就沒有相關的內存操作。

        //我們可以調用實例變量的setter方法,來給實例變量賦值,這樣就可以使用setter方法中的內存操作來保證實例變量的內存安全性。

//        _name = name;

       self.name = name;

//        _gender = gender;

       self.gender = gender;

//        _ID = ID;

       self.ID = ID;

    }

    return self;

}


=========================================================================================

2.便利構造器:是類方法,封裝了alloc和init方法,使用起來更方便

.h文件

+ (instancetype)studentWithName:(NSString *)name gender:(NSString *)gender ID:(int)ID


.m文件

+ (instancetype)studentWithName:(NSString *)name gender:(NSString *)gender ID:(int)ID{

   return [[Studentalloc] initWithName:namegender:genderID:ID];// 這裏已經不是以前的self了

}

main.m文件

// 調用便利構造器

    Student *stu = [StudentstudentWithName:@"康大亮"gender:@"m"ID:100650114];//使用便利構造器創建學生對象

   NSLog(@"姓名:%@,性別:%@,學號:%d", [stuname], [stu gender], [stuID]);

    stu.name =@"諸葛孔明";

   NSLog(@"姓名:%@", stu.name);


=========================================================================================

3.重寫父類的description方法 

description方法:當使用%@打印一個對象的時候,會調用這個方法 

 在.m文件中,重寫description方法: 

#pragma mark --重寫系統提供的初始化方法

// 重寫系統提供的初始化方法來定製自己需要的實例變量的值!

- (instancetype)init{

    

    _name = @"張三"; // _name的可見度是默認的、受保護的可見度(protected),在類的內部可以直接訪問。

    return self;

}


在main.m的main函數中測試: 

#pragma mark -訪問實例變量

    // 創建一個person對象

    Person *person1 = [[Person alloc] init];

    

//    person1->_name = @"劉蜀葵";  // 因爲_nameprotected可見度,所以在這裏不能直接訪問

    

    

//    person1->_gender = @"";   // 因爲_gender@private修飾的可見度,所以在這裏不能直接訪問

    

    

    person1->_age = 23 // 因爲_age@public修飾的可見度,所以可以在這裏訪問到

    NSLog(@"%@", [person1 name]);


輸出結果:

2013-07-19  13:56:36.834 OC02實例變量可見度和方法-1[1305:85014]張三



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章