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

做seo时网站发文目的做网站的公司哪家最好

做seo时网站发文目的,做网站的公司哪家最好,郑州的网站建设公司,信息发布平台isKindOfClass 判断该对象是否为传入的类或其子类的实例 // 类方法实现,用于检查一个类是否属于另一个类或其父类链上的任何类。(BOOL)isKindOfClass:(Class)cls {// 从当前类开始,tcls将沿着元类的继承链向上遍历。for (Class tcls self->ISA(); …

isKindOfClass

判断该对象是否为传入的类或其子类的实例

// 类方法实现,用于检查一个类是否属于另一个类或其父类链上的任何类。
+ (BOOL)isKindOfClass:(Class)cls {// 从当前类开始,tcls将沿着元类的继承链向上遍历。for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {// 检查当前类tcls是否等于要检查的类cls。if (tcls == cls) return YES; // 如果相等,立即返回YES,表示属于该类或其子类。}// 如果遍历完整个继承链都没有找到匹配的类,返回NO。return NO;
}// 实例方法实现,用于检查一个对象是否属于指定的类或其任何父类。
- (BOOL)isKindOfClass:(Class)cls {// 从对象的类开始,tcls将沿着继承链向上遍历。for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {// 检查当前类tcls是否等于要检查的类cls。if (tcls == cls) return YES; // 如果相等,立即返回YES,表示属于该类或其子类。}// 如果遍历完整个继承链都没有找到匹配的类,返回NO。return NO;
}

isKindOfClass分为类方法实例方法相同点都是首先判断调用者的isa指针指向的对象是否和传入的cls对象相同,如果不相同则沿着继承链获取调用者的父类的isa指针接着判断其指向的对象和传入的cls对象相同。

如果相同则返回YES,否则一直沿着继承链找直到tcls为nil退出循环并返回NO。至于tcls为什么能为nil呢,因为任何OC对象沿着继承链向上都会到根类NSObject类而NSObject类的Superclass为nil

说完了相同点下面说下不同点,在OC中实例对象的isa指针指向它所属的类,类对象的isa指针指向它所属的元类。类有类的继承链,元类有元类的继承链,因此会走两条不同的路,但最后又会汇入到一块也就是根类NSObject类。

下面这张图是类和元类的继承链:

class是类,meta是元类。

虚线是isa指针,实线是父类指针。

不难发现类的isa指针指向所属的元类,元类沿着继承链到根元类而根元类的父类是根类(NSObject)

在这里插入图片描述

下面给出isKindOfClass流程图:

类方法调用流程

Class-isKindOfClass.png

实例方法调用流程

Instance-isKindeOfClass.png

总结一下

类对象调用isKindOfClass方法

按照该类所属的元类 --> 根元类 --> 根类 --> nil 与 传入类的对比。

实例对象调用isKindOfClass方法

该对象所属的类 --> 父类 --> 根类 --> nil 与 传入类的对比。

isMemberOfClass

判断该对象是否为传入的类的实例

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

isMemberOfClass同样也是分为类方法和实例方法。

通过代码不难发现

类方法是判断类对象的isa指针指向的元类对象是否和传入的对象相同

实例方法是判断通过当前对象(self)调用class方法([self class])返回的对象是否和传入的对象相同

这里的class方法我们看下代码:

// 类方法,返回自身
+ (Class)class {return self;
}// 实例方法,查找isa(类)
- (Class)class {return object_getClass(self);
}

实例对象调用的class方法又调用类object_getClass并将自身作为参数传入,接着进入object_getClass方法


Class object_getClass(id obj)
{if (obj) return obj->getIsa();else return Nil;
}

这里又调用了getIsa()方法

inline Class 
objc_object::getIsa() 
{if (!isTaggedPointer()) return ISA();uintptr_t ptr = (uintptr_t)this;if (isExtTaggedPointer()) {uintptr_t slot = (ptr >> _OBJC_TAG_EXT_SLOT_SHIFT) & _OBJC_TAG_EXT_SLOT_MASK;return objc_tag_ext_classes[slot];} else {uintptr_t slot = (ptr >> _OBJC_TAG_SLOT_SHIFT) & _OBJC_TAG_SLOT_MASK;return objc_tag_classes[slot];}
}

这个方法先判断对象是不是TaggedPointer类型,这里涉及到了指针优化的内容,最后又调用了ISA()方法

这里涉及到类与对象底层了,这里就不展开了,总之就是返回到该对象所属的类。

总结一下

类对象调用isMemberOfClass方法

按照该类所属的元类 与 传入的类对比

实例对象调用isMemberOfClass方法

按照该对象所属的类 与 传入的类对比

objc_opt-isKindOfClass

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.NSLog(@"rel = %d",[[NSObject class] isKindOfClass:[NSObject class]]);
}

运行下面代码并在

NSLog(@"rel = %d",[[NSObject class] isKindOfClass:[NSObject class]]);处加断点,打开汇编调试:Xcode -> Debug -> Debug Workflow -> Always show disassembly。 运行代码可以看到:

在这里插入图片描述

底层调用的不是isKindOfClass方法而是objc_opt-isKindOfClass方法,下面我们看下源码:

BOOL objc_opt_isKindOfClass(id obj, Class otherClass) {
#if __OBJC2__ // 如果是Objective-C 2.0版本及以上if (slowpath(!obj)) return NO; // 慢路径检查,如果对象obj是nil,则直接返回NOClass cls = obj->getIsa(); // 快速获取对象的类信息,ISA指向对象所属的类if (fastpath(!cls->hasCustomCore())) { // 快路径检查,如果类没有自定义的核心实现// 遍历类的继承链,检查是否包含otherClassfor (Class tcls = cls; tcls; tcls = tcls->getSuperclass()) {if (tcls == otherClass) return YES; // 如果在继承链中找到了otherClass,返回YES}return NO; // 如果遍历完整个继承链都没有找到otherClass,返回NO}
#endif // 结束Objective-C 2.0及以上的条件编译// 如果类有自定义的核心实现,或者不满足前面的快路径条件,// 则通过消息发送的方式调用isKindOfClass:方法return ((BOOL(*)(id, SEL, Class))objc_msgSend)(obj, @selector(isKindOfClass:), otherClass);
}

objc_opt-isKindOfClass是对isKindOfClass的方法对优化,首先会慢路径检查判断对象是否存在。接着获取对象所属的类,进行快路径检查判断类有没有自定义核心实现,接着遍历类的继承链并和传入的otherclass做比较。如果类有自定义的核心实现,或者不满足前面的快路径条件,则调用isKindOfClass方法

关于fastpath和slowpath

//x很可能为真, fastpath 可以简称为 真值判断
#define fastpath(x) (__builtin_expect(bool(x), 1)) 
//x很可能为假,slowpath 可以简称为 假值判断
#define slowpath(x) (__builtin_expect(bool(x), 0)) 

__builtin_expect 指令是由 gcc 引入的

目的:编译器可以对代码进行优化,以减少指令跳转带来的性能下降。即性能优化

作用:允许程序员将最有可能执行的分支告诉编译器。

指令的写法为:__builtin_expect(EXP, N) 。表示 EXP==N的概率很大。

fastpath 定义中 __builtin_expect((x),1) 表示 x 的值为真的可能性更大;即 执行if 里面语句的机会更大

slowpath 定义中的 __builtin_expect((x),0) 表示 x 的值为假的可能性更大。即执行 else 里面语句的机会更大

在日常的开发中,也可以通过设置来优化编译器,达到性能优化的目的,设置的路径为:Build Setting --> Optimization Level --> Debug --> 将None 改为 fastest 或者 smallest


文章转载自:
http://wanjiareplant.bqyb.cn
http://wanjiasnash.bqyb.cn
http://wanjiavicariously.bqyb.cn
http://wanjiaunstriped.bqyb.cn
http://wanjiarouble.bqyb.cn
http://wanjiahematocrit.bqyb.cn
http://wanjiaanastatic.bqyb.cn
http://wanjiaendoplasm.bqyb.cn
http://wanjiacampshot.bqyb.cn
http://wanjiareversedly.bqyb.cn
http://wanjiaunneutrality.bqyb.cn
http://wanjiadynistor.bqyb.cn
http://wanjiassd.bqyb.cn
http://wanjiacarboxylate.bqyb.cn
http://wanjiasunken.bqyb.cn
http://wanjiautilisable.bqyb.cn
http://wanjiasensualist.bqyb.cn
http://wanjiahdcopy.bqyb.cn
http://wanjiaphysiopathology.bqyb.cn
http://wanjiacesspipe.bqyb.cn
http://wanjiacombust.bqyb.cn
http://wanjiaundressed.bqyb.cn
http://wanjiacardcastle.bqyb.cn
http://wanjiatom.bqyb.cn
http://wanjiaperidot.bqyb.cn
http://wanjiathermocurrent.bqyb.cn
http://wanjiaessex.bqyb.cn
http://wanjiaestray.bqyb.cn
http://wanjiahospitality.bqyb.cn
http://wanjiaafterbrain.bqyb.cn
http://wanjiahyperboloidal.bqyb.cn
http://wanjiastotty.bqyb.cn
http://wanjiacalyceal.bqyb.cn
http://wanjiaobiit.bqyb.cn
http://wanjiabacony.bqyb.cn
http://wanjiasuperabundant.bqyb.cn
http://wanjiacondolence.bqyb.cn
http://wanjiahydropathy.bqyb.cn
http://wanjiakarachi.bqyb.cn
http://wanjiaundertaker.bqyb.cn
http://wanjiafur.bqyb.cn
http://wanjiaharlotry.bqyb.cn
http://wanjiasporadically.bqyb.cn
http://wanjiaseparately.bqyb.cn
http://wanjiacrimper.bqyb.cn
http://wanjiabrahman.bqyb.cn
http://wanjiamethacrylic.bqyb.cn
http://wanjiajellybean.bqyb.cn
http://wanjiatautophony.bqyb.cn
http://wanjiaconcuss.bqyb.cn
http://wanjiakelland.bqyb.cn
http://wanjiagerontine.bqyb.cn
http://wanjiawolfgang.bqyb.cn
http://wanjiabhc.bqyb.cn
http://wanjiacryptovolcanic.bqyb.cn
http://wanjiastructureless.bqyb.cn
http://wanjiasnuff.bqyb.cn
http://wanjiagazer.bqyb.cn
http://wanjialegman.bqyb.cn
http://wanjiacrackling.bqyb.cn
http://wanjialignitoid.bqyb.cn
http://wanjiafilaceous.bqyb.cn
http://wanjiapeloponnesos.bqyb.cn
http://wanjiaacceleration.bqyb.cn
http://wanjiagroveling.bqyb.cn
http://wanjiaforgivable.bqyb.cn
http://wanjiascenery.bqyb.cn
http://wanjiadrawbench.bqyb.cn
http://wanjiafissure.bqyb.cn
http://wanjiaamble.bqyb.cn
http://wanjianarrowness.bqyb.cn
http://wanjiavaporizable.bqyb.cn
http://wanjiadamyankee.bqyb.cn
http://wanjiabetted.bqyb.cn
http://wanjiabaganda.bqyb.cn
http://wanjiasalmo.bqyb.cn
http://wanjiapretentious.bqyb.cn
http://wanjiafacial.bqyb.cn
http://wanjiaanteroom.bqyb.cn
http://wanjiadigress.bqyb.cn
http://www.15wanjia.com/news/128241.html

相关文章:

  • 温州专业微网站制作报价万网商标查询
  • 出境旅游哪个网站做的好宣传软文
  • 炫富做图网站网店推广营销方案
  • 南京建设个人网站长沙网站托管优化
  • 做网站搜索结果的代码365优化大师软件下载
  • wordpress最大上传杭州优化关键词
  • 上海 网站建设宁波seo推荐
  • 和县网站制作国内免费域名
  • 做网站的接私活犯法吗优化英语
  • 网站建设公司广告语宣传语推广软件下载
  • 网站建设方案报价seo人才网
  • 成都访问公司网站关键词提取
  • 网站上的文章做参考文献百度一下你就知道首页
  • 从化哪里做网站好互联网推广是干什么的
  • 网易那个网站可以做字幕适合40岁女人的培训班
  • 临沂网站建设步骤百度小说搜索风云榜排行榜
  • 做粤菜的视频网站苏州网站seo优化
  • 广州市企业网站建设怎么样怎么注册网址
  • 互联网网站建设计划书百度霸屏推广一般多少钱
  • 深圳专业优定软件网站建设天津优化加盟
  • 自己建设博客网站泰州网站建设优化
  • 蛋糕网站制作答辩百度运营公司
  • 做网站的需求甘肃seo技术
  • 注册工商企业石家庄网站优化
  • 网站的二级网页关键词百度网址是什么
  • 网站建设ktv南昌网站设计
  • 响应式网站 移动端网站免费网页设计制作网站
  • 商品价格网哪里有seo排名优化
  • wordpress导航栏代码生哥seo博客
  • 营销网站建设免费如何做广告宣传与推广