一段代碼引發的思考:
@implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); //Son NSLog(@"%@", NSStringFromClass([super class])); //Son } return self; } @end問題1:self 是什么 ?
問題2:super 是什么 ?
問題3:[super init] 到底做了什么 ?
問題4:為什么把 [super init] 的地址賦值給 self ?
問題5:為什么NSLog的輸出都Son ?
一、答案區
答1:
1> self 是 OC 提供保留字;
2> self 代表着當前方法的調用者;
3> 在 - 方法中,self代表着"對象";
4> 在 + 方法中,self代表着"類";
5> self 是方法的隱藏的參數變量,指向當前調用方法的對象,另一個隱藏參數是 _cmd,代表當前類方法的selector。
答2:
1> super 是 OC 提供保留字;
2> super 不是隱藏的參數,它只是一個"編譯器指示符"。查找方法時,指定方法查找的位置在父類。
答3:
1> 遞歸初始化父類對象,直到root對象;
答4:
1> 整個對象過程中只有一個對象 self ,不存在父類對象的指針;
2> 對象內部不管是 self 還是 super 其消息主體只有一個就是 self ,也就是說 self 和 super 指向的是同一個對象;
3> 在父類初始化失敗的時候,返回nil,終止操作。
答5:
1> 參見 答4 ,結果顯而易見,self 和 super是同一個實體。
二、疑惑區
解析:
1> 面向對象過程中,子類繼承父類,就擁有了父類所有的屬性方法,一個完整的類的初始化包括子類初始化和父類初始化。
2> 子類 [alloc init] 后,首先這里只有一個對象實體self,沒有所謂的父類對象實體super。初始化過程中,父類屬性、方法初始化都屬於子類對象的一部分,super 的指針賦給 self 這一說法是錯的,其實全部指的是該對象的初始位置。
總結的過程中參考了以下鏈接:
1. 關於 self 和 super 在 OC 中的疑惑與解析(幫助很大)