self指針:
- self是oc面向對象設計中的一個特殊指針,相當于java中的this,但是比this強大,this隻能通路執行個體對象的相關方法和成員變量,或者說this隻代表執行個體對象;
- self不僅可以代表執行個體對象,還可以代表類對象;誰調用目前方法,self就代表誰;如果self用在了以"-"号的方法中,也就是對象方法中,那麼就代表執行個體對象,若果在"+"号開頭的方法中,self就代表類對象,因為隻有類對象才能調用以"+"号開頭的方法;
- self調用成員變量:self->age; 調用方法:[self test]; // age是成員變量,test是方法;
- 但是self如果調用的不得當,會引起死循環:
- (void) test { NSLog(@"hahha"); [self test]; // 首先這個self肯定是執行個體對象,這樣調用會引發死循環; }
super指針:
- 和self差不多,隻不過它是調用的目前類的父類的方法,不管是類方法還是對象方法;
- 如果super處在目前類的類方法中,就會調用父類的類方法; 如果super處在目前類的對象方法中,就會調用父類的對象方法;
- 使用場景:子類如果想覆寫父類的某個方法,且隻是對父類方法的延伸,在父類的基礎上增加功能,那麼在重寫的方法中就先用super調用父類的方法;
#import <Foundation/Foundation.h> // 父類Person類 @interface Person : NSObject // 為了友善說明問題,定義兩個同名方法,一個是類方法,一個是對象方法,walk方法是要被子類覆寫的; - (void)test; + (void)test; - (void)walk; @end @implementation Person - (void)test { NSLog(@"對象方法-test"); } + (void)test { NSLog(@"類方法-test"); } - (void)walk { NSLog(@"walk"); } @end // 子類 Boy @interface Boy : Person - (void)haha; + (void)haha1; - (void)walk; @end @implementation Boy - (void)haha { [super test]; // 在對象方法中調用super,調用的時父類的對象方法test } + (void)haha1 { [super test]; // 在類方法中調用super,調用的時父類的類方法test } - (void)walk { [super walk]; // 掉用父類的walk方法 NSLog(@"run"); } @end int main() { Boy *b = [Boy new]; [b haha]; // 在對象方法中調用super,調用的時父類的對象方法test,輸出 -test [Boy test]; // 在對象方法中調用super,調用的時父類的對象方法test,輸出 +test return 0; }
isa指針是每個對象内部自動生成,指向類對象的指針;