zoukankan      html  css  js  c++  java
  • [self class]与[super class]

    @implementation Son : Father
    - (id)init
    {
        self = [super init];
        if (self)
        {
            NSLog(@"%@", NSStringFromClass([self class]));
            NSLog(@"%@", NSStringFromClass([super class]));
        }
    return self;
    }
    @end

    self是类的一个隐藏参数,每个方法的实现的第一个参数即为self
    super并不是隐藏参数,它实际上只是一个“编译器标识符”,它负责告诉编译器当调用方法时去调用父类的方法,而不是本类中的方法
    在调用[super class]的时候,runtime会去调用objc_msgSendSuper方法,而不是objc_msgSend
    OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )
    
    /// Specifies the superclass of an instance. 
    struct objc_super {
        /// Specifies an instance of a class.
        __unsafe_unretained id receiver;
    
        /// Specifies the particular superclass of the instance to message. 
    #if !defined(__cplusplus)  &&  !__OBJC2__
        /* For compatibility with old objc-runtime.h header */
        __unsafe_unretained Class class;
    #else
        __unsafe_unretained Class super_class;
    #endif
        /* super_class is the first class to search */
    };
    在objc_msgSendSuper方法中,第一个参数是一个objc_super的结构体,里边有两个变量,一个是接收消息的receiver,一个是当前类的父类super_class
    因为objc_super->receiver是self,也就是Son,所以两个输出都是Son

  • 相关阅读:
    python中字母的大小写转换
    十进制转换为16进制
    查找数组中出现次数超过一半的数
    leetcode二分查找
    leetcode 3 字符串
    leetcode链表篇
    leetcode数组篇
    重构二叉树
    矩阵的特征向量和特征值
    微软编程
  • 原文地址:https://www.cnblogs.com/yangyangyang/p/6744190.html
Copyright © 2011-2022 走看看