鍍金池/ 問答/C  iOS/ 誰能用自己的話解釋init和initWithFrame調(diào)用的先后順序原因

誰能用自己的話解釋init和initWithFrame調(diào)用的先后順序原因

這是一個自定義view:

@implementation MyView

- (instancetype)init {
    if (self = [super init]) {
        NSLog(@"調(diào)用了init");
    }
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        NSLog(@"調(diào)用了initWithFrame");
    }
    return self;
}


@end

現(xiàn)在我調(diào)用它的init方法:

MyView *myView = [[MyView alloc] init];

控制臺打印信息是:
2017-10-09 11:14:35.224 block[2391:262544] 調(diào)用了initWithFrame
2017-10-09 11:14:35.225 block[2391:262544] 調(diào)用了init

問:
為什么先打印的是initWithFrame而不是init?

回答
編輯回答
下墜
MyView *myView = [[MyView alloc] init];

代碼調(diào)用過程如下:

  1. 動態(tài)查找到 MyView 的 init 方法
  2. 調(diào)用 super init 方法
  3. super init 方法內(nèi)部執(zhí)行的是 [super initWithFrame:CGRectZero]
  4. 然后 super 會發(fā)現(xiàn) MyView 實現(xiàn)了 initWithFrame 方法
  5. 轉(zhuǎn)而執(zhí)行 [MyView initWithFrame:CGRectZero]
  6. 最后再執(zhí)行 init 其余部分

關(guān)鍵點:OC 里面的 super 實際上是讓某個類自己去調(diào)用父類的方法, 而不是父類去調(diào)用某方法。方法動態(tài)調(diào)用過程中的順序是按照繼承關(guān)系從下到上。

2017年8月14日 23:00
編輯回答
熟稔
  • (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;

NS_DESIGNATED_INITIALIZER 你可以找下關(guān)于這個宏定義的資料。

2017年6月18日 12:29