天天看點

OC self super isa指針

self指針:

  1. self是oc面向對象設計中的一個特殊指針,相當于java中的this,但是比this強大,this隻能通路執行個體對象的相關方法和成員變量,或者說this隻代表執行個體對象;
  2. self不僅可以代表執行個體對象,還可以代表類對象;誰調用目前方法,self就代表誰;如果self用在了以"-"号的方法中,也就是對象方法中,那麼就代表執行個體對象,若果在"+"号開頭的方法中,self就代表類對象,因為隻有類對象才能調用以"+"号開頭的方法;
  3. self調用成員變量:self->age; 調用方法:[self test]; // age是成員變量,test是方法;
  4. 但是self如果調用的不得當,會引起死循環:
    - (void) test
    {
          NSLog(@"hahha");
          [self test]; // 首先這個self肯定是執行個體對象,這樣調用會引發死循環;  
    }      

super指針:

  1. 和self差不多,隻不過它是調用的目前類的父類的方法,不管是類方法還是對象方法;
  2. 如果super處在目前類的類方法中,就會調用父類的類方法; 如果super處在目前類的對象方法中,就會調用父類的對象方法;
  3. 使用場景:子類如果想覆寫父類的某個方法,且隻是對父類方法的延伸,在父類的基礎上增加功能,那麼在重寫的方法中就先用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指針是每個對象内部自動生成,指向類對象的指針;