[self class]和[super class]带来的思考

本文探讨Objective-C中[self class]和[super class]的区别,从源码实现、实例与元类关系等方面进行深入分析,揭示它们在消息传递和方法查询中的作用。
摘要由CSDN通过智能技术生成

前言

class是很多人经常使用的方法,而【self class】和【super class】的区别也在面试中经常使用到。如下所述:


#import "Person.h"

@interface Man : Person

@end

#import "Man.h"

@implementation Man

- (instancetype)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", [self class]);
        NSLog(@"%@", [super class]);
    }
    return self;
}

@end

那么问题来了,控制台打印的值是什么?

追根溯源

源码实现

想知道这个值是什么的话,最简单的方式当然是跑一下咯。不过,这样做的话,一点都没有灵魂了。所以,我们就用clang编译一下这个文件,看看他在编译器中是怎么做的。命令是 clang -rewrite-objc XXX.m

编译后的后的CPP文件内容炒鸡多,我们找到关键的init方法(秘诀:翻到底部)如下:


static instancetype _I_Man_init(Man * self, SEL _cmd) {
    self = ((Man *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值