美文网首页iOS之Objective-C基础
iOS开发OC之super关键词

iOS开发OC之super关键词

作者: geekMole | 来源:发表于2016-03-29 20:08 被阅读799次

    super关键词经常使用,但是概念却有时候朦朦胧胧在此故意挖个坑,体会一下绕坑的感觉

    • 先上代码:

    • main.m文件

    #import "ViewController.h"
    #import "SubPerson.h"
    void main(){
      SubPerson *p = [[SubPerson alloc] init];
      [p test];
    }
    

    • Person.h文件
    #import <Foundation/Foundation.h>
    @interface Person : NSObject
    - (void)test;
    @end
    
    • Person.m文件
    #import "Person.h"
    @implementation Person
    - (void)test{
        //结果验证 self -> SubPerson
        // SubPerson Person SubPerson Person
        NSLog(@"Person中的打印:%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
    }
    @end
    

    • 子类SubPerson.h文件
    #import "Person.h"
    @interface SubPerson : Person
    
    @end
    
    • 子类SubPerson.m文件
    #import "SubPerson.h"
    
    @implementation SubPerson
    - (void)test
    {
    NSLog(@"SubPerson中的打印:%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
        //仅仅是让子类对象调用父类的方法,并没有改变调用者的身份
        //即前面的执行对象改为自己,后面的方法替换为父类的方法来执行
        [super test];    
    }
    @end
    

    最终输出结果子类打印和父类打印相同,总结:

    • class: 获取方法调用者的类
    • superclass: 获取方法调用者的父类
    • super:super不是一个指针,super只是编译指示器

    再来一个Demo:

    @implementation SuperViewController
    - (void) methodB{
        NSLog(@"Super methodB.");
    }
    - (void) methodA{
        NSLog(@"Super methodA.");
        [self methodB];
    }
    @end
    ///////////////////////////////////////////////////////
    @implementation SubViewController
    - (void)viewDidLoad {
        //......
        [super methodA];
        [self methodA];
    }
    - (void) methodB{
        NSLog(@"Sub methodB.");
    }
    - (void) methodA{
        NSLog(@"Sub methodA.");
    }
    @end
    
    • 输出结果:
    Super methodA.
    Sub methodB.
    Sub methodA.
    

    相关文章

      网友评论

        本文标题:iOS开发OC之super关键词

        本文链接:https://www.haomeiwen.com/subject/znyslttx.html