@implementation Son : Father
- (id)init {
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
运行结果:Son Son
看到运行结果,应该相当一部分的人认为是 Son Father.
为啥是 [super class] 是 Son ,那我们就分析一下整个流程:
当 [self class] 、 [super class] 调用的是 -(Class)calss,但是 [self class]、[super class] 都没有实现 -(Class)class,通过消息传递一直会找到基类NSObject 中,并且找到 -(Class)class 实现,可以在 NSObject.m 中找到这个方法:
- (Class)class {
return object_getClass(self);
}
object_getClass 这个方法是获取当前对象的类对象。看看 object_getClass 内部实现
在 runtime 文件中可以找 objc_class.m 找到 object_getClass 的实现:
Class object_getClass(id obj) {
if (obj) return obj->getIsa();
else return Nil;
}
最终这个方法还是通过 obj 的 isa 指针,找到当前的对象的类对象。
我们可以 clang -rewrite-objc 命令将下面
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
转换成:
NSLog((NSString *)&__NSConstantStringImpl__var_folders_8k_cgm28r0d0bz94xnnrr606rf40000gn_T_Car_3f2069_mi_0, NSStringFromClass(((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class"))));
NSLog((NSString *)&__NSConstantStringImpl__var_folders_8k_cgm28r0d0bz94xnnrr606rf40000gn_T_Son_3f2069_mi_1, NSStringFromClass(((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Son"))}, sel_registerName("class"))));
clang 之后代码看出,调用 [super class] 的时候本质是调用:
objc_msgSendSuper(struct objc_super *super, SEL op, ...)
查看一下 objc_super 的定义如下:
struct objc_super {
/// Specifies an instance of a class.
__unsafe_unretained _Nonnull 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 _Nonnull Class class;
#else
__unsafe_unretained _Nonnull Class super_class;
#endif
/* super_class is the first class to search */
};
objc_super 内部结构可以看出,只要编译器看到出现 super 这个标志,就会让当前对象不管本类有没有实现都是去父类去找该方法,super就仅仅是一个编译指示器。 但是消息的接受还是 self,最终在 NSObject 获取 isa 指针的时候获取的还是 self 的 isa,执行的类对象还是 Son。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有