当前位置: 首页 > news >正文

网站开发颜色选择器服务商平台登陆

网站开发颜色选择器,服务商平台登陆,17网站一起做 佛山,广西建设厅微信网站前言 这个归根结底还是在考察我们对isa走向图和类的继承的理解,也就是苹果官方这幅图: 接下来的函数调用流程请参考这张图。 1 isKindOfClass方法 1.1 objc_opt_isKindOfClass C函数 查看源码可发现,无论是谁调用isKindOfClass方法都会…

前言

这个归根结底还是在考察我们对isa走向图和类的继承的理解,也就是苹果官方这幅图:
在这里插入图片描述

接下来的函数调用流程请参考这张图。

1 isKindOfClass方法

1.1 objc_opt_isKindOfClass C函数

查看源码可发现,无论是谁调用isKindOfClass方法都会进入这个C函数。(这个C函数位于NSObjective.mm

// Calls [obj isKindOfClass]
// 当obj调用isKindOfClass时,objc_opt_isKindOfClass会被触发
// obj是一个id类型,id是一个objc_object结构体指针,意味着,传进来的可以是时类,也可以是类的实例对象
// otherClass就是isKindOfClass的参数,我们当初传进去的cls
BOOL objc_opt_isKindOfClass(id obj, Class otherClass)
{
#if __OBJC2__if (slowpath(!obj)) return NO;Class cls = obj->getIsa();	 // 此处的cls仅是obj的第一个isaif (fastpath(!cls->hasCustomCore())) {// otherClass 从obj的ISA开始,依次和ISA的父类比较,直到找到或者父类为nil结束// 当父类为nil意味着最后一个和otherClass比较的是NSObject根类。for (Class tcls = cls; tcls; tcls = tcls->superclass) {if (tcls == otherClass) return YES;}return NO;}
#endifreturn ((BOOL(*)(id, SEL, Class))objc_msgSend)(obj, @selector(isKindOfClass:), otherClass);
}

可知:

  1. 一切皆从调用者objisa开始,然后顺着superclass走下去,直到找到clssuperclassnil结束。
  2. superclassnil,意味着最后的根类NSObject也不是cls,返回flase

1.2 类SubClass调用+ (BOOL)isKinsOfClass:(Class)cls

流程:

  1. 从类的isa——元类开始,判断它不是cls
  2. 如果是,返回true
  3. 如果不是,继续用元类的superclasscls比较,看是不是cls
  4. 直到根类NSObject也比较完。

判断顺序: SubClassMetaClass->MetaClass->...->RootMetaClass->NSObject

总结:

  • 判断cls是不是 元类->父类的元类->父父类的元类->…->根元类->NSObject (元类的superclass继承链)其中一个。
  • cls 传除NSObject.class外的任意类对象均为false

1.3 元类MetaClass 调用+ (BOOL)isKinsOfClass:(Class)cls

流程:

  1. MetaClassISA 指向 RootMetaClass ,所以从 RootMetaClass 开始比较判断是不是我们传入的cls;
  2. 如果不是,再看根类NSObject是不是,如果NSObject也不是,就彻底没有了,返回false

判断顺序:MetaClassRootMetaClass->NSObject

总结:

  • 判断cls是不是 根元类->NSObject 中的任意一个。

1.4 对象obj 调用- (BOOL)isKinsOfClass:(Class)cls

流程:

  1. isa指向的类对象开始,判断是不是cls
  2. 如果不是,看类对象的父类,逐级判断是不是cls
  3. 直到找到返回true,或者判断到NSObject依然不是,返回false结束。

判断顺序: objectSubClass -> SubClass ->...->NSObject

总结:

  • 判断cls是不是 类对象->父类->…->NSObject (superclass继承链)其中一个。

2 isMemberOfClass

2.1 类对象SubClass调用+ (BOOL)isMemberOfClass

源码:

+ (BOOL)isMemberOfClass:(Class)cls {return self->ISA() == cls;
}

不用像isKindOfClass循环直到找到或nil,他只要比较cls是不是我当前的isa指向,是返回true,不是返回false。

判断:SubClassMetaClass

2.2 元类MetaClass 调用+ (BOOL)isMemberOfClass

因为元类的isa只指向根元类NSObejct ,所以除了NSObject的类SubClass以外,传入任何类对象也都是false。

验证传入NSObject的类SubClass的结果:

void demo(void) {
//    BOOL re1 = [[NSObject class] isKindOfClass:[NSObject class]];Class rootMetaClass = object_getClass([NSObject class]);NSLog(@"%d", [[NSObject class] isMemberOfClass:rootMetaClass]);
}

结果:
在这里插入图片描述

2.3 对象obj调用 -(BOOL)isMemberofClass:(Class)clss

- (BOOL)isMemberOfClass:(Class)cls 底层源码:

- (BOOL)isMemberOfClass:(Class)cls {return [self class] == cls;
}
- (Class)class {return object_getClass(self); // 获取当前的isa指向的类
}

只要判断对象的isa,也就是图中的SubClass是不是我们传入的cls。

3. 测试

void demo(void) {BOOL f1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];BOOL f2 = [(id)[MyClass class] isKindOfClass:[MyClass class]];BOOL f3 = [(id)[MySuperClass class] isKindOfClass:[MySuperClass class]];BOOL f4 = [(id)[MyClass class] isKindOfClass:[MySuperClass class]];BOOL f5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];BOOL f6 = [(id)[MyClass alloc] isKindOfClass:[NSObject class]];BOOL f7 = [(id)[MySuperClass alloc] isKindOfClass:[NSObject class]];NSLog(@"NSObjectClass ISKindOf NSObjectClass:%d", f1);NSLog(@"MyClassClass ISKindOf MyClassClass:%d", f2);NSLog(@"MySuperClassClass ISKindOf MySuperCassClass:%d", f3);NSLog(@"MyClassClass ISKindOf MySuperClassClass:%d", f4);NSLog(@"NSObjectObj ISKindOf NSObjectClass:%d", f5);NSLog(@"MyClassObj ISKindOf NSObjectClass:%d", f6);NSLog(@"MySuperClassObj ISKindOf NSObjectClass:%d", f7);}

测试结果:
在这里插入图片描述

http://www.yayakq.cn/news/44903/

相关文章:

  • 增城微网站建设wordpress主题中英文
  • 辽宁网站建设的网络科技公司不能打开建设银行网站怎么办
  • 仿新浪全站网站源码怎样仿制网站
  • 网站建设.软件开发vi设计网站有哪些
  • app网站建设展厅布置摆放设计公司
  • 英文网站建设哪家强做双语网站用什么cms系统好
  • 建设银行人才招聘官方网站韩国网站never
  • 给小孩做辅食的网站网络营销师报名
  • 西宁市建设局网站深圳最好的网站开发公司电话
  • 郑州网站制作营销重庆有网站公司
  • 杭州网站优化平台下载app软件商店
  • 网站数据库名称怎么改网站怎么看好与不好
  • 如何屏蔽网站ip微商运营
  • 如何开 网站建设公司网站建设毕业设计心得
  • 广告发布网站模板广告设计需要美术功底吗
  • 低成本创业项目模板网站 seo
  • 外管局网站上做预收登记电子商务网站模板 下载
  • 免费响应式模板网站模板网站建设时间怎么查询
  • 常德 网站建设网站刷链接怎么做
  • title (网站开发)青岛网站建设公司外包
  • 行业网站大全家装设计公司起名
  • 网站更换主机wordpress适合任务网站吗
  • 给别人做网站赚钱吗企业营销型网站案例
  • 站内seo是什么意思wordpress代码混乱
  • 广东智能网站建设质量保障dw网站指向邮箱超链接怎么做
  • 网站开发用什么开发网站开发 盈利
  • 视频网站app怎么做的广告平面设计图片
  • dede网站模板 音响WordPress 采集文章 图片
  • 黄浦区网站建设河南网站建设首选公司
  • 帝国cms企业网站久久建筑网企业