我們都知道:self是類的隱藏參數,指向當前調用方法的這個類的實例。那 super 呢?
很多人會想當然的認為“super 和 self 類似,應該是指向父類的指針吧!”。這是很普遍的一個誤區。其實 super 是一個 Magic Keyword,它本質是一個編譯器標示符,和 self是指向的同一個消息接受者!他們兩個的不同點在于:super 會告訴編譯器,調用 class 這個方法時,要去父類的方法,而不是本類里的。
不管調用[selfclass]還是[super class],接受消息的對象都是當前的這個對象。
當使用 self調用方法時,會從當前類的方法列表中開始找,如果沒有,就從父類中再找;而當使用 super 時,則從父類的方法列表中開始找。然后調用父類的這個方法。
這也就是為什么說“不推薦在init 方法中使用點語法”,如果想訪問實例變量 iVar 應該使用下劃線( _iVar ),而非點語法( self.iVar )。
點語法( self.iVar )的壞處就是子類有可能覆寫 setter 。假設 Person 有一個子類叫ChenPerson,這個子類專門表示那些姓“陳”的人。該子類可能會覆寫 lastName 屬性所對應的設置方法.而重寫后的方法優先級高于原本的方法優先級.