区块链技术博客
www.b2bchain.cn

大师重磅内容(12)-类的分析-面试题求职学习资料

本文介绍了大师重磅内容(12)-类的分析-面试题求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

objc_objectobjc_class 对象

  • objc_class 继承 objc_object
  • 对象的底层实现都是以objc_object为模板创建的, 对象和objc_object 并不是继承关系

isKindOfClassisMemberOfClass

BOOL reg1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL reg2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL reg3 = [(id)[LWPerson class] isKindOfClass:[LWPerson class]]; BOOL reg4 = [(id)[LWPerson class] isMemberOfClass:[LWPerson class]]; NSLog(@" reg1 :%hhd reg2 :%hhd reg3 :%hhd reg4 :%hhd",reg1,reg2,reg3,reg4);  BOOL reg5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; BOOL reg6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; BOOL reg7 = [(id)[LWPerson alloc] isKindOfClass:[LWPerson class]]; BOOL reg8 = [(id)[LWPerson alloc] isMemberOfClass:[LWPerson class]]; NSLog(@" reg5 :%hhd reg6 :%hhd reg7 :%hhd reg8 :%hhd",reg5,reg6,reg7,reg8);  2021-06-20 15:41:30.839265+0800 KCObjcBuild[3949:139738]  reg1 :1 reg2 :0 reg3 :0 reg4 :0 2021-06-20 15:41:30.839826+0800 KCObjcBuild[3949:139738]  reg5 :1 reg6 :1 reg7 :1 reg8 :1

Xcode中把macOS的版本调到10.15以下,或者iOS的版本13.0以下。查看下汇编代码

大师重磅内容(12)-类的分析-面试题

源码分析:isKindOfClassisMemberOfClass底层的实现都是objc_msgSend消息转发。通过SEL找到对应的IMP

Xcode中把macOS的版本调到10.15以上,或者iOS的版本13.0以上。查看下汇编代码

大师重磅内容(12)-类的分析-面试题

源码分析:isKindOfClass底层的实现objc_opt_isKindOfClassclass底层的实现objc_opt_class,isMemberOfClass还是走消息转发

objc4-818.2 全局搜索isKindOfClassisMemberOfClassobjc_opt_isKindOfClassobjc_opt_class

isKindOfClass 底层实现

+ (BOOL)isKindOfClass:(Class)cls {     for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {         if (tcls == cls) return YES;     }     return NO; }  - (BOOL)isKindOfClass:(Class)cls {     for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {         if (tcls == cls) return YES;     }     return NO; }

isMemberOfClass 底层实现

+ (BOOL)isMemberOfClass:(Class)cls {     return self->ISA() == cls; }  - (BOOL)isMemberOfClass:(Class)cls {     return [self class] == cls; }
  • + isKindOfClass 流程。 类的元类 vs cls(需要比较的类),不同继续比较 。元类的父类 vs cls,不同继续比较直到找到根元类。根元类 vs cls,不同继续比较。根类(NSObject) vs cls,如果还不相同则根类(NSObject)的父类为nil,跳出循环返回NO

  • - isKindOfClass 流程。获取当前对象所属类, vs cls,不同继续比较 。类的父类 vs cls,不同继续比较直到找到根类(NSObject)根类(NSObject) vs cls,如果还不相同则根类(NSObject)的父类为nil,跳出循环返回NO

  • + isMemberOfClass 流程。 类的元类 vs cls(需要比较的类),相同就返回YES,否则返回NO

  • - isMemberOfClass 流程。 vs cls(需要比较的类),相同就返回YES,否则返回NO

objc_opt_isKindOfClass 底层实现

OBJC_EXPORT BOOL objc_opt_isKindOfClass(id _Nullable obj, Class _Nullable cls)     OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);

isKindOfClass的底层实现objc_opt_isKindOfClass支持的版本masOS大于10.15iOS大于13.0

// Calls [obj isKindOfClass] BOOL objc_opt_isKindOfClass(id obj, Class otherClass) { #if __OBJC2__ //现在基本上都用OBJC2版本     //slowpath(!obj)  obj为空的是小概率事件基本不会发生     if (slowpath(!obj)) return NO;     // 获取类或者是元类:obj是对象就获取类,如果obj是类就获取元类     Class cls = obj->getIsa();     //fastpath(!cls->hasCustomCore()) (类或者父类中大概率没有默认的isKindOfClass方法)     if (fastpath(!cls->hasCustomCore())) {         for (Class tcls = cls; tcls; tcls = tcls->getSuperclass()) {             if (tcls == otherClass) return YES;         }         return NO;     } #endif //OBJC版本直接走消息转发     return ((BOOL(*)(id, SEL, Class))objc_msgSend)(obj, @selector(isKindOfClass:), otherClass); }

基本上都用OBJC2版本,obj->getIsa()获取类或者元类:obj是对象就获取类obj是类就获取元类
然后就接着for循环,for里面的代码和isKindOfClass逻辑一样就不进行分析了,可以直接看
isKindOfClass的分析

objc_opt_class 底层实现

OBJC_EXPORT Class _Nullable objc_opt_class(id _Nullable obj)     OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);

class的底层实现objc_opt_class支持的版本masOS大于10.15iOS大于13.0

“`c
// Calls [obj class]
Class
objc_opt_class(id obj)
{

if __OBJC2__

objc_objectobjc_class 对象

  • objc_class 继承 objc_object
  • 对象的底层实现都是以objc_object为模板创建的, 对象和objc_object 并不是继承关系

isKindOfClassisMemberOfClass

BOOL reg1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL reg2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL reg3 = [(id)[LWPerson class] isKindOfClass:[LWPerson class]]; BOOL reg4 = [(id)[LWPerson class] isMemberOfClass:[LWPerson class]]; NSLog(@" reg1 :%hhd reg2 :%hhd reg3 :%hhd reg4 :%hhd",reg1,reg2,reg3,reg4);  BOOL reg5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; BOOL reg6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; BOOL reg7 = [(id)[LWPerson alloc] isKindOfClass:[LWPerson class]]; BOOL reg8 = [(id)[LWPerson alloc] isMemberOfClass:[LWPerson class]]; NSLog(@" reg5 :%hhd reg6 :%hhd reg7 :%hhd reg8 :%hhd",reg5,reg6,reg7,reg8);  2021-06-20 15:41:30.839265+0800 KCObjcBuild[3949:139738]  reg1 :1 reg2 :0 reg3 :0 reg4 :0 2021-06-20 15:41:30.839826+0800 KCObjcBuild[3949:139738]  reg5 :1 reg6 :1 reg7 :1 reg8 :1

Xcode中把macOS的版本调到10.15以下,或者iOS的版本13.0以下。查看下汇编代码

大师重磅内容(12)-类的分析-面试题

源码分析:isKindOfClassisMemberOfClass底层的实现都是objc_msgSend消息转发。通过SEL找到对应的IMP

Xcode中把macOS的版本调到10.15以上,或者iOS的版本13.0以上。查看下汇编代码

大师重磅内容(12)-类的分析-面试题

源码分析:isKindOfClass底层的实现objc_opt_isKindOfClassclass底层的实现objc_opt_class,isMemberOfClass还是走消息转发

objc4-818.2 全局搜索isKindOfClassisMemberOfClassobjc_opt_isKindOfClassobjc_opt_class

isKindOfClass 底层实现

+ (BOOL)isKindOfClass:(Class)cls {     for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {         if (tcls == cls) return YES;     }     return NO; }  - (BOOL)isKindOfClass:(Class)cls {     for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {         if (tcls == cls) return YES;     }     return NO; }

isMemberOfClass 底层实现

+ (BOOL)isMemberOfClass:(Class)cls {     return self->ISA() == cls; }  - (BOOL)isMemberOfClass:(Class)cls {     return [self class] == cls; }
  • + isKindOfClass 流程。 类的元类 vs cls(需要比较的类),不同继续比较 。元类的父类 vs cls,不同继续比较直到找到根元类。根元类 vs cls,不同继续比较。根类(NSObject) vs cls,如果还不相同则根类(NSObject)的父类为nil,跳出循环返回NO

  • - isKindOfClass 流程。获取当前对象所属类, vs cls,不同继续比较 。类的父类 vs cls,不同继续比较直到找到根类(NSObject)根类(NSObject) vs cls,如果还不相同则根类(NSObject)的父类为nil,跳出循环返回NO

  • + isMemberOfClass 流程。 类的元类 vs cls(需要比较的类),相同就返回YES,否则返回NO

  • - isMemberOfClass 流程。 vs cls(需要比较的类),相同就返回YES,否则返回NO

objc_opt_isKindOfClass 底层实现

OBJC_EXPORT BOOL objc_opt_isKindOfClass(id _Nullable obj, Class _Nullable cls)     OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);

isKindOfClass的底层实现objc_opt_isKindOfClass支持的版本masOS大于10.15iOS大于13.0

// Calls [obj isKindOfClass] BOOL objc_opt_isKindOfClass(id obj, Class otherClass) { #if __OBJC2__ //现在基本上都用OBJC2版本     //slowpath(!obj)  obj为空的是小概率事件基本不会发生     if (slowpath(!obj)) return NO;     // 获取类或者是元类:obj是对象就获取类,如果obj是类就获取元类     Class cls = obj->getIsa();     //fastpath(!cls->hasCustomCore()) (类或者父类中大概率没有默认的isKindOfClass方法)     if (fastpath(!cls->hasCustomCore())) {         for (Class tcls = cls; tcls; tcls = tcls->getSuperclass()) {             if (tcls == otherClass) return YES;         }         return NO;     } #endif //OBJC版本直接走消息转发     return ((BOOL(*)(id, SEL, Class))objc_msgSend)(obj, @selector(isKindOfClass:), otherClass); }

基本上都用OBJC2版本,obj->getIsa()获取类或者元类:obj是对象就获取类obj是类就获取元类
然后就接着for循环,for里面的代码和isKindOfClass逻辑一样就不进行分析了,可以直接看
isKindOfClass的分析

objc_opt_class 底层实现

OBJC_EXPORT Class _Nullable objc_opt_class(id _Nullable obj)     OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);

class的底层实现objc_opt_class支持的版本masOS大于10.15iOS大于13.0

“`c
// Calls [obj class]
Class
objc_opt_class(id obj)
{

if __OBJC2__

objc_objectobjc_class 对象

  • objc_class 继承 objc_object
  • 对象的底层实现都是以objc_object为模板创建的, 对象和objc_object 并不是继承关系

isKindOfClassisMemberOfClass

BOOL reg1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL reg2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL reg3 = [(id)[LWPerson class] isKindOfClass:[LWPerson class]]; BOOL reg4 = [(id)[LWPerson class] isMemberOfClass:[LWPerson class]]; NSLog(@" reg1 :%hhd reg2 :%hhd reg3 :%hhd reg4 :%hhd",reg1,reg2,reg3,reg4);  BOOL reg5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; BOOL reg6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; BOOL reg7 = [(id)[LWPerson alloc] isKindOfClass:[LWPerson class]]; BOOL reg8 = [(id)[LWPerson alloc] isMemberOfClass:[LWPerson class]]; NSLog(@" reg5 :%hhd reg6 :%hhd reg7 :%hhd reg8 :%hhd",reg5,reg6,reg7,reg8);  2021-06-20 15:41:30.839265+0800 KCObjcBuild[3949:139738]  reg1 :1 reg2 :0 reg3 :0 reg4 :0 2021-06-20 15:41:30.839826+0800 KCObjcBuild[3949:139738]  reg5 :1 reg6 :1 reg7 :1 reg8 :1

Xcode中把macOS的版本调到10.15以下,或者iOS的版本13.0以下。查看下汇编代码

大师重磅内容(12)-类的分析-面试题

源码分析:isKindOfClassisMemberOfClass底层的实现都是objc_msgSend消息转发。通过SEL找到对应的IMP

Xcode中把macOS的版本调到10.15以上,或者iOS的版本13.0以上。查看下汇编代码

大师重磅内容(12)-类的分析-面试题

源码分析:isKindOfClass底层的实现objc_opt_isKindOfClassclass底层的实现objc_opt_class,isMemberOfClass还是走消息转发

objc4-818.2 全局搜索isKindOfClassisMemberOfClassobjc_opt_isKindOfClassobjc_opt_class

isKindOfClass 底层实现

+ (BOOL)isKindOfClass:(Class)cls {     for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {         if (tcls == cls) return YES;     }     return NO; }  - (BOOL)isKindOfClass:(Class)cls {     for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {         if (tcls == cls) return YES;     }     return NO; }

isMemberOfClass 底层实现

+ (BOOL)isMemberOfClass:(Class)cls {     return self->ISA() == cls; }  - (BOOL)isMemberOfClass:(Class)cls {     return [self class] == cls; }
  • + isKindOfClass 流程。 类的元类 vs cls(需要比较的类),不同继续比较 。元类的父类 vs cls,不同继续比较直到找到根元类。根元类 vs cls,不同继续比较。根类(NSObject) vs cls,如果还不相同则根类(NSObject)的父类为nil,跳出循环返回NO

  • - isKindOfClass 流程。获取当前对象所属类, vs cls,不同继续比较 。类的父类 vs cls,不同继续比较直到找到根类(NSObject)根类(NSObject) vs cls,如果还不相同则根类(NSObject)的父类为nil,跳出循环返回NO

  • + isMemberOfClass 流程。 类的元类 vs cls(需要比较的类),相同就返回YES,否则返回NO

  • - isMemberOfClass 流程。 vs cls(需要比较的类),相同就返回YES,否则返回NO

objc_opt_isKindOfClass 底层实现

OBJC_EXPORT BOOL objc_opt_isKindOfClass(id _Nullable obj, Class _Nullable cls)     OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);

isKindOfClass的底层实现objc_opt_isKindOfClass支持的版本masOS大于10.15iOS大于13.0

// Calls [obj isKindOfClass] BOOL objc_opt_isKindOfClass(id obj, Class otherClass) { #if __OBJC2__ //现在基本上都用OBJC2版本     //slowpath(!obj)  obj为空的是小概率事件基本不会发生     if (slowpath(!obj)) return NO;     // 获取类或者是元类:obj是对象就获取类,如果obj是类就获取元类     Class cls = obj->getIsa();     //fastpath(!cls->hasCustomCore()) (类或者父类中大概率没有默认的isKindOfClass方法)     if (fastpath(!cls->hasCustomCore())) {         for (Class tcls = cls; tcls; tcls = tcls->getSuperclass()) {             if (tcls == otherClass) return YES;         }         return NO;     } #endif //OBJC版本直接走消息转发     return ((BOOL(*)(id, SEL, Class))objc_msgSend)(obj, @selector(isKindOfClass:), otherClass); }

基本上都用OBJC2版本,obj->getIsa()获取类或者元类:obj是对象就获取类obj是类就获取元类
然后就接着for循环,for里面的代码和isKindOfClass逻辑一样就不进行分析了,可以直接看
isKindOfClass的分析

objc_opt_class 底层实现

OBJC_EXPORT Class _Nullable objc_opt_class(id _Nullable obj)     OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 5.0);

class的底层实现objc_opt_class支持的版本masOS大于10.15iOS大于13.0

“`c
// Calls [obj class]
Class
objc_opt_class(id obj)
{

if __OBJC2__

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 大师重磅内容(12)-类的分析-面试题求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们