07-08、構造方法基本概念:重寫init方法

weixin_34138377發表於2017-09-21

在OC中init開頭的方法, 我們稱之為構造方法
構造方法的用途: 用於初始化一個物件, 讓某個物件一建立出來就擁有某些屬性和值

重寫init方法, 在init方法中初始化成員變數
注意: 重寫init方法必須按照蘋果規定的格式重寫, 如果不按照規定會引發一些未知的錯誤
1.必須先初始化父類, 再初始化子類
2.必須判斷父類是否初始化成功, 只有父類初始化成功才能繼續初始化子類
3.返回當前物件的地址

#import "Person.h"

@implementation Person

/*
第一種寫法:
- (instancetype)init
{
// 1.初始化父類
// 只要父類初始化成功 , 就會返回對應的地址, 如果初始化失敗, 就會返回nil
// nil == 0 == 假 == 沒有初始化成功
self = [super init];
// 2.判斷父類是否初始化成功
if (self != nil) {
    // 3.初始化子類
    // 設定屬性的值
    _age = 6;
    
}
// 4.返回地址
return self;
}
 */

/*
第二種寫法:
- (instancetype)init
{
self = [super init]; // self == nil == 0
if (self) {
    // 初始化子類
    _age = 6;
}
return self;
}
 */
//第三種寫法:常用的寫法
- (instancetype)init
{
//    self = [super init];
// 注意: 不要把 = 號寫為 ==
// 一定要將[super init]的返回值賦值給self
if (self = [super init]) {
    // 初始化子類
    _age = 6;
}
return self;
}

@end

例子:

Person.m
#import "Person.h"

@implementation Person

- (instancetype)init
{
if (self  = [super init]) {
    _age = 10;
}
return self;
}

- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i", _age];
}
@end
Studnet.m
#import "Studnet.h"

@implementation Studnet

- (instancetype)init
{
if (self = [super init]) {
    
    //注意:這裡不能直接訪問父類的_age屬性,因為被@property生成的成員變數是私有變數(和private不同的)只能在自己的那個類中可見和訪問,才其他類中不可見,更不能直接訪問了。所以這裡想給_age賦值可以用self呼叫_age的setter方法。
    
//        [self setAge:10];不過這裡不用呼叫setter方法因為super就是父類,父類中已經初始化_age了
    
    _no = 1;
}
return self;
}

- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i , no = %i", [self age], _no];
}
@end

相關文章