<dl id='uhr4o'></dl>

  • <tr id='uhr4o'><strong id='uhr4o'></strong><small id='uhr4o'></small><button id='uhr4o'></button><li id='uhr4o'><noscript id='uhr4o'><big id='uhr4o'></big><dt id='uhr4o'></dt></noscript></li></tr><ol id='uhr4o'><table id='uhr4o'><blockquote id='uhr4o'><tbody id='uhr4o'></tbody></blockquote></table></ol><u id='uhr4o'></u><kbd id='uhr4o'><kbd id='uhr4o'></kbd></kbd>

    <code id='uhr4o'><strong id='uhr4o'></strong></code>

      <ins id='uhr4o'></ins>
      <i id='uhr4o'></i>

      <fieldset id='uhr4o'></fieldset>

          <span id='uhr4o'></span>
          <acronym id='uhr4o'><em id='uhr4o'></em><td id='uhr4o'><div id='uhr4o'></div></td></acronym><address id='uhr4o'><big id='uhr4o'><big id='uhr4o'></big><legend id='uhr4o'></legend></big></address>

            <i id='uhr4o'><div id='uhr4o'><ins id='uhr4o'></ins></div></i>

            深入解构objc_msgSend函数的实现

            • 时间:
            • 浏览:8
            • 来源:124软件资讯网

              阅读本文后你将会进一步相识Runtime的实现  ,享元设计模式的实践 ,内存数据存储优化 ,编译内存屏障  ,多线程无锁读写实现  ,垃圾接纳等相关的手艺点  。

              objc_class(Class工具)结构简介

              熟悉OC语言的Runtime(运行时)机制以及工具要领挪用机制的开发者都知道  ,所有OC要领挪用在编译时都市转化为对C函数objc_msgSend的挪用  。

              /*下面的例子是在arm64系统下的函数挪用实现  ,本文中若是没有特殊说明都是指在arm64系统下的结论*/
                 // [view1 addSubview:view2];
                objc_msgSend(view1, "addSubview:", view2);

                 // CGSize size = [view1 sizeThatFits:CGSizeZero];
                 CGSize size = objc_msgSend(view1, "sizeThatFits:"CGSizeZero);
                 //  CGFloat alpha = view1.alpha; 
                 CGFloat alpha = objc_msgSend(view1, "alpha");

              系统的Runtime库通过函数objc_msgSend以及OC工具中隐藏的isa数据成员来实现多态和运行时要领查找以及执行  。每个工具的isa中生存着这个工具的类工具指针  ,类工具是一个Class类型的数据  ,而Class则是一个objc_class结构体指针类型的别名  ,它被界说如下:

                 typedef struct objc_class * Class;

              虽然在对外公然袒露的头文件#import 中可以看到关于struct objc_class的界说 ,但惋惜的是那只是objc1.0版本的界说  ,而现在所运行的objc2.0版本运行时库并没有袒露出struct objc_class所界说的详细内容  。

              你可以在https://opensource.apple.com/source/objc4/objc4-723/中下载和检察开源的最新版本的Runtime库源代码  。Runtime库的源代码是用汇编和C++混淆实现的 ,你可以在头文件objc-runtime-new.h中看到关于struct objc_class结构的详细界说  。objc_class结构体用来形貌一个OC类的类信息:包罗类的名字、所继续的基类、类中界说的要领列表形貌、属性列表形貌、实现的协议形貌、界说的成员变量形貌等等信息  。在OC中类信息也是一个工具 ,以是又称类信息为Class工具 。 下面是一张objc_class结构体界说的静态类图:

              objc_class类结构图