文档章节

第02天实战技术(05):super,superClass,class

宇鸿165
 宇鸿165
发布于 2017/03/25 16:54
字数 695
阅读 5
收藏 0

#####一、super,superClass,class

  • 1.self、super的本质
  self  : 是一个指针
  super : 仅仅是一个编译指示器, 就是给编译器看的, 它不是一个指针
  本质 : 只要编译器看到super这个标志,就会让当前对象调用父类方法,本质还是当前对象调用

  • 2.class、super class的作用
class : 获取当前方法 调用者的类
super class : 获取当前方法调用者的父类
  • 3.super,superClass,class的演练
      1. 创建两个类Person、subPerson(继承Person)

Person

#import <Foundation/Foundation.h>

@interface Person : NSObject
- (void)test;
@end
 ---

#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

#import "Person.h"

@interface SubPerson : Person

@end
---

#import "SubPerson.h"

/**
  self  : 是一个指针
  super : 仅仅是一个编译指示器, 就是给编译器看的, 它不是一个指针
  本质 : 只要编译器看到super这个标志,就会让当前对象调用父类方法,本质还是当前对象调用
 */
@implementation SubPerson
- (void)test
{
    // class : 获取当前方法 调用者的类
    // super class : 获取当前方法调用者的父类
    
    

    // NSLog(@"%@",self);
    // NSLog(@"%@",super); // Use of undeclared identifier 'super' 说我没有定义super这个属性
    
// SubPerson Person Person NSObject   (想到的)
// SubPerson Person SubPerson Person   (✅)
    
    // NSLog(@"%@ %@ %@ %@",[self class],[self superclass],[super class],[super superclass]);
    
    [super test];
}
@end

Persn由此至终都没有创建过对象, 都是SubPerson创建对象进行调用了方法 所以当SubPerson调用了[super test]的时候,会去到父类Person里面进行实现方法 但是Person里面的self 其实就是SubPerson 所以两次结果都会一样

#import "ViewController.h"
#import "SubPerson.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    SubPerson *p = [[SubPerson alloc]init];
    [p test];
}


@end

--- super的底层实现 1.我创建一个终端的项目 2.我创建了一个Person类 实现了description方法`进行终端生成最终代码

1.cd 到main.m
2.clang -rewrite-objc main.m
3.最主要是
 return ((NSString *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Person"))}, sel_registerName("description"));

>>>
objc_msgSendSuper (self)
 objc_msgSendSuper self 说明是当前消息发送者
#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person
#pragma description 转换成C++的代码
/**
 static NSString * _I_Person_description(Person * self, SEL _cmd) {
 return ((NSString *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Person"))}, sel_registerName("description"));
 }
 objc_msgSendSuper self 说明是当前消息发送者
 */

- (NSString *)description
{
    
#pragma objc_msgSendSuper(谁发送了消息(self): 说明还是当前消息发送者)
    // OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ ) // 第一个参数是结构体

#pragma objc_super 是一个结构体
//    /// 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 */
//    };
    
    
    return [super description];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
    }
    return 0;
}

1.如果终端出现生成最终代码错误信息(很有可能是Xcode的原因)

5_1终端错误信息_可能Xcode没有设置.png 5_2super的底层实现.png

© 著作权归作者所有

宇鸿165
粉丝 1
博文 919
码字总数 368963
作品 0
广州
私信 提问
[super class]与[self class]、isKindOfClass与isMemberOfClass

面试题一 在项目中新建Person类继承NSObject,在Person类中打印 打印结果分别是什么? 源码分析 回答这个面试题之前我们需要先弄懂两点: •class与superClass方法 •super关键字 class方法 ...

coderLZ
2018/06/01
0
0
iOS self和super底层实现原理

//联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 一、 self和super区别 1.self是类,super是预编译指令 2.self调用自己方法,super调用父类方法 3.【self class】和【super class】输出是一样...

石虎132
2018/01/04
0
0
Who am I? —— Java 多态特性一例

测试代码如下: SuperClass.java SubClass.java Client.java 上面的代码中,SubClass 覆盖了SuperClass 的 field a and its method hello(). Client 的输出结果会是什么呢? 运行代码,得如下...

Iridium
2018/11/25
13
0
Java How to Program习题_第九章_面向对象编程继承(Object-Oriented Programming: Inheritance)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hpdlzu80100/article/details/85778067 这章的题目是目前为止所有章节中最简单的!...

预见未来to50
01/04
0
0
iOS Runtime面试题(isKindOfClass 与 isMemberOfClass)

isKindOfClass 与 isMemberOfClass 下面代码输出什么? 答案:1000 详解: 在isKindOfClass中有一个循环,先判断class是否等于meta class,不等就继续循环判断是否等于meta class的super cla...

iOS开发_小迷糊
07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部