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

三网合一网站源码下载上海做网站hlanggroup

三网合一网站源码下载,上海做网站hlanggroup,义乌市网络科技有限公司,如何制作网址二维码Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文…Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文章 引入——静态绑定和动态绑定 我们知道OC实际上是在C的基础上引入面向对象的内容我们先来理解在C语言之中函数调用的方式——静态绑定static binding也就是编译器在编译的时候就能够知道运行时所调用的函数以书中的代码为例 #include stdio.hvoid printHello() {printf(Hello, world!\n); }void printGoodbye() {printf(Goodbye, world!\n); }void doTheThing(int type) {if (type 0) {printHello();} else {printGoodbye();} }在这段代码中函数 printHello 和 printGoodbye 的调用是直接的编译器在编译时就能确定这些函数的调用路径。在这个过程中函数名直接指向特定的地址编译器无需做任何动态决策。所有的函数调用都在编译时已经解析好了这就是静态绑定。 再来看下一个例子如果我们将代码改写为以下的内容 void printHello() {printf(Hello, world!\n); }void printGoodbye() {printf(Goodbye, world!\n); }void doTheThing(int type) {void (*fnc)(); // 定义一个函数指针if (type 0) {fnc printHello; // 如果type为0指向printHello函数} else {fnc printGoodbye; // 否则指向printGoodbye函数}fnc(); // 调用通过指针指定的函数 }这种方法就是动态绑定(dynamic binding)。在编译时编译器并不知道 fnc 最终会指向哪个函数它只能知道 fnc 是一个指向 void() 类型的函数指针但不能确定它指向的函数直到程序运行时。也就是说函数的调用和方法的选择是在程序运行时才决定的因为编译器无法在编译时确定到底调用哪个函数。 OC之中动态绑定的实现 在Objective- C中如果向某对象传递消息那就会使用动态绑定机制来决定需要调用的方法。在底层所有方法都是普通的C语言函数然而对象收到消息之后究竟该调用哪个方法则完全于运行期决定甚至可以在程序运行时改变这些特性使得Objective- C成为 一门真正的动态语言。 我们模拟给对象发送通知 id returnValue [someObject messageName:parameter];编译器看到这条命令之后就会自动的将其转化一条标准的C语言函数调用objc_msgSend objc_msgSend 是 Objective-C 的一个底层函数它是 Objective-C 动态消息传递机制的核心。通过它消息被发送给对象进而调用对象的某个方法。 方法签名 objc_msgSend 的函数签名如下简化版 id objc_msgSend(id self, SEL _cmd, ...);self消息的接收者即对象。_cmd选择子后面的 ...是方法参数消息的实际内容。 所以刚刚上面的代码就可以转化为以下函数 id returnValue objc_msgSend (someObject, selector (messageName:), parameter) ;接下来就是objc_msgSend根据接受者类型以及选择子来调用对应的方法借用书中的原话 方法需要在接收者所属的类中搜寻其“方法列表”list of methods。如果能找到与选择子名称相符的方法就跳至其实现代码。若是找不到那就沿着继承体系继续向上查找等找到合适的方法之后再跳转。如果最终还是找不到相符的方法那就执行 “消息转发”message forwarding操作。 方法列表 这里说到了方法列表就顺带讲一下 在 Objective-C 中每个类都有一套方法列表用于存储该类的所有实例方法、类方法及它们的相关信息。这些方法列表Method List用数组的形式存储了与类相关的所有方法并且可以通过运行时Runtime机制进行动态查找和调用。 我们知道方法有两种类方法和实例方法那么方法列表也可以分成两种 实例方法Instance Methods这些方法是类的实例对象调用的。 类方法Class Methods这些方法是类本身而非类的实例调用的。 获取实例方法列表 使用 class_copyMethodList 函数可以获取某个类的实例方法列表。返回的是一个 Method 数组数组中包含了该类的所有实例方法。 unsigned int methodCount 0; Method *methods class_copyMethodList([MyClass class], methodCount); for (unsigned int i 0; i methodCount; i) {Method method methods[i];SEL methodSelector method_getName(method); // 获取方法的选择子const char *methodTypeEncoding method_getTypeEncoding(method); // 获取方法类型编码NSLog(Method name: %s, sel_getName(methodSelector)); } free(methods); class_copyMethodList返回类的实例方法列表。method_getName获取方法的选择子。method_getTypeEncoding获取方法的类型编码。sel_getName将选择器转换为字符串。 获取类方法列表 获取类方法列表的过程和获取实例方法列表类似只不过你需要使用 class_copyMethodList 获取的是类本身而不是类的实例的方法列表。 unsigned int methodCount 0; Method *methods class_copyMethodList(object_getClass([MyClass class]), methodCount); for (unsigned int i 0; i methodCount; i) {Method method methods[i];SEL methodSelector method_getName(method);const char *methodTypeEncoding method_getTypeEncoding(method);NSLog(Class method name: %s, sel_getName(methodSelector)); } free(methods);object_getClass获取类的元类meta-class元类包含了类方法。 其他方法 在使用objc_msgSend的时候我们注意到我们的返回值是OC对象但如果我们这个函数返回的是其他内容例如结构体浮点数和超类的极端情况出现时objc_msgSend可能就有局限性了。那么自然有其他的方法来解决这些问题 objc_msgSend_stret 当待发送的消息返回结构体时可交由此函数处理。 前提条件只有当 CPU 的寄存器能够容纳返回类型时此函数才能处理该消息。 如果返回的结构体太大无法完全容纳于 CPU 寄存器中那么将会由另一个函数执行消息派发。此时那个函数会在栈上分配一个变量来处理返回的结构体。 objc_msgSend_fpret 当消息返回的是浮点数时可交由此函数处理。 原因在某些 CPU 架构中调用函数时需要特别处理浮点数寄存器Floating-point register即浮点数的处理方式与普通寄存器不同。因此通常的 objc_msgSend 在这种情况下并不合适。此函数主要用于处理像 x86 架构等需要特殊处理的 CPU 环境。 objc_msgSendSuper 如果要给超类发送消息例如 [super message:parameter]则交由此函数处理。 此外还有两个与 objc_msgSend_stret 和 objc_msgSend_fpret 等效的函数用于处理发给超类的相应消息。 尾调用优化 尾调用优化TCO是一种编译器优化技术。它的核心思想是 如果一个函数的最后一个操作是调用另一个函数并且这个函数的返回值不会被进一步使用那么编译器可以避免为这个函数创建新的栈帧。 尾调用的条件是 最后一个操作是直接调用另一个函数。返回值没有进一步的操作比如乘法、加法等。 具体是否使用尾调用优化的情景可以看这篇文章 正常我们调用一个递归的函数CPU会不断向调用堆栈之中推入栈帧如下图 每次我们通过 objc_msgSend 调用一个方法时都会为这次调用创建一个新的栈帧。栈帧包含了当前方法调用的信息如参数、返回地址等。由于 OC 的动态特性objc_msgSend 需要在调用之前处理很多工作比如查找方法的实现、解析参数等这些都需要在栈中存储信息。 书中的原话 只有当某个函数的最后一个操作仅仅是调用另一个函数并且不使用该函数的返回值时才可以执行“尾调用优化”Tail Call Optimization。 在 Objective-C 中objc_msgSend 的尾调用优化非常关键。如果没有进行尾调用优化每次调用 Objective-C 方法时都需要为调用 objc_msgSend 函数准备一个新的“栈帧”。这些栈帧会在 “栈踪迹”stack trace中可见。 如果不进行尾调用优化调用栈会不断增长可能会导致“栈溢出”stack overflow现象。栈溢出通常发生在递归调用或大量函数调用没有得到优化时导致栈空间耗尽。 以下是使用尾调用优化时函数栈帧的变化都是共用同一个栈帧 总结 消息其实就是由接受者选择子和方法参数所构成给对象发送消息其实就是相当于在该对象之中调用方法。通过 objc_msgSend方法的调用变得非常灵活可以在运行时根据对象和方法选择器找到并执行相应的方法。这个机制为我们后面学习的动态方法解析、消息转发、方法交换等强大的特性做了铺垫。 参考文章 iOS objc_msgSend尾调用优化机制
文章转载自:
http://www.morning.nckjk.cn.gov.cn.nckjk.cn
http://www.morning.nfpct.cn.gov.cn.nfpct.cn
http://www.morning.lggng.cn.gov.cn.lggng.cn
http://www.morning.ndxss.cn.gov.cn.ndxss.cn
http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn
http://www.morning.alive-8.com.gov.cn.alive-8.com
http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn
http://www.morning.yuanshenglan.com.gov.cn.yuanshenglan.com
http://www.morning.xylxm.cn.gov.cn.xylxm.cn
http://www.morning.qtqk.cn.gov.cn.qtqk.cn
http://www.morning.bpmth.cn.gov.cn.bpmth.cn
http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn
http://www.morning.qdscb.cn.gov.cn.qdscb.cn
http://www.morning.yzdth.cn.gov.cn.yzdth.cn
http://www.morning.fbjnr.cn.gov.cn.fbjnr.cn
http://www.morning.prkdl.cn.gov.cn.prkdl.cn
http://www.morning.lxbml.cn.gov.cn.lxbml.cn
http://www.morning.mswkd.cn.gov.cn.mswkd.cn
http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn
http://www.morning.mzpd.cn.gov.cn.mzpd.cn
http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn
http://www.morning.nckzt.cn.gov.cn.nckzt.cn
http://www.morning.rjmg.cn.gov.cn.rjmg.cn
http://www.morning.drytb.cn.gov.cn.drytb.cn
http://www.morning.xnkh.cn.gov.cn.xnkh.cn
http://www.morning.fcrw.cn.gov.cn.fcrw.cn
http://www.morning.lkthj.cn.gov.cn.lkthj.cn
http://www.morning.wkjzt.cn.gov.cn.wkjzt.cn
http://www.morning.pcqxr.cn.gov.cn.pcqxr.cn
http://www.morning.ypktc.cn.gov.cn.ypktc.cn
http://www.morning.lhsdf.cn.gov.cn.lhsdf.cn
http://www.morning.pmxw.cn.gov.cn.pmxw.cn
http://www.morning.kpfds.cn.gov.cn.kpfds.cn
http://www.morning.yrnrr.cn.gov.cn.yrnrr.cn
http://www.morning.fqklt.cn.gov.cn.fqklt.cn
http://www.morning.ywxln.cn.gov.cn.ywxln.cn
http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn
http://www.morning.lcmhq.cn.gov.cn.lcmhq.cn
http://www.morning.fllfc.cn.gov.cn.fllfc.cn
http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn
http://www.morning.nzlqt.cn.gov.cn.nzlqt.cn
http://www.morning.mfrb.cn.gov.cn.mfrb.cn
http://www.morning.fxxmj.cn.gov.cn.fxxmj.cn
http://www.morning.zfgh.cn.gov.cn.zfgh.cn
http://www.morning.lltdf.cn.gov.cn.lltdf.cn
http://www.morning.wchcx.cn.gov.cn.wchcx.cn
http://www.morning.nhpgm.cn.gov.cn.nhpgm.cn
http://www.morning.yrnll.cn.gov.cn.yrnll.cn
http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn
http://www.morning.lekbiao.com.gov.cn.lekbiao.com
http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn
http://www.morning.qqtzn.cn.gov.cn.qqtzn.cn
http://www.morning.zcnwg.cn.gov.cn.zcnwg.cn
http://www.morning.mdmqg.cn.gov.cn.mdmqg.cn
http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn
http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn
http://www.morning.njftk.cn.gov.cn.njftk.cn
http://www.morning.hbywj.cn.gov.cn.hbywj.cn
http://www.morning.pzrpz.cn.gov.cn.pzrpz.cn
http://www.morning.zrnph.cn.gov.cn.zrnph.cn
http://www.morning.wzwpz.cn.gov.cn.wzwpz.cn
http://www.morning.qwfl.cn.gov.cn.qwfl.cn
http://www.morning.jypqx.cn.gov.cn.jypqx.cn
http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn
http://www.morning.rswtz.cn.gov.cn.rswtz.cn
http://www.morning.seoqun.com.gov.cn.seoqun.com
http://www.morning.kzdwt.cn.gov.cn.kzdwt.cn
http://www.morning.srbmc.cn.gov.cn.srbmc.cn
http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn
http://www.morning.sthp.cn.gov.cn.sthp.cn
http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn
http://www.morning.tsnq.cn.gov.cn.tsnq.cn
http://www.morning.sgbk.cn.gov.cn.sgbk.cn
http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn
http://www.morning.hhskr.cn.gov.cn.hhskr.cn
http://www.morning.qbpqw.cn.gov.cn.qbpqw.cn
http://www.morning.rdwm.cn.gov.cn.rdwm.cn
http://www.morning.ljngm.cn.gov.cn.ljngm.cn
http://www.morning.npxht.cn.gov.cn.npxht.cn
http://www.morning.lndongguan.com.gov.cn.lndongguan.com
http://www.tj-hxxt.cn/news/265436.html

相关文章:

  • 台州网站制作系统网络营销的特点举例
  • 网站设计平台合肥百度推广公司哪家好
  • 珠海市建设局官方网站深圳高端网站建设创新
  • 网站手机端自适应湖南关键词排名推广
  • asp网站模板源码免费无限下载做网站优化的
  • 学校做网站方案淘宝seo是什么意思
  • 网站有了如何做推广个人主页是什么
  • 东莞做网站哪家好简述网页的制作流程
  • 大连建设银行招聘网站网站制作价格怎么算
  • 如何建立网站的步骤网站建设遇到哪些攻击
  • 上海网站开发哪家好企业管理软件排行
  • 企业系统定制开发关键词优化排名详细步骤
  • 网站建设公司方唯珠宝网站建商台北
  • 厦门市建设局查询保障摇号网站首页外链发布论坛
  • 网站seo外包wordpress 没有模板选项
  • 广西 南宁 微信微网站开发photoshop教程
  • 网站搭建系列教程公司宣传手册内容模板
  • 深圳网站建设推广平台音乐网站如何做
  • 免费推广网站下载搜索关键词的方法
  • 帐号售卖网站建设html可以做网站吗
  • 饰品做商城网站模式软件开发能力
  • 专门更新最新设计的网站集团网站设计公司
  • 阳江网站建设新会网站建设
  • 深圳网站建设外贸公司排名桦甸市建设局网站
  • 奉贤区做网站网站当前位置 样式
  • 我国网站无障碍建设仍处于免费接码网页版中国
  • 公司网站设计网络公司广西南宁人才招聘网站
  • 怎么免费建立一个网站免费网站制作公司
  • 广州免费自助建站开发医疗器械生产许可证
  • 自营店网站建设深圳保障性住房和安居房的区别