OC 中 self 與 super 總結


一段代碼引發的思考:

@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 中的疑惑與解析(幫助很大)

2. self = [super init] 的學習

3. self = [super init] 的思考

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM