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

成都航空公司官方网站谷歌浏览器网页

成都航空公司官方网站,谷歌浏览器网页,桂林旅游网站制作公司,平面设计岗位描述怎么写一、概要 主要说明分类和扩展的基本作用,然后从runtime方面深入抛析分类和扩展的原理。 二、分类 分类是运行时的决议,一般用来分解体积庞大的文件,分类可以添加实例方法、类方法、协议、属性(不能添加实例变量)。简…

一、概要

主要说明分类和扩展的基本作用,然后从runtime方面深入抛析分类和扩展的原理。

二、分类

分类是运行时的决议,一般用来分解体积庞大的文件,分类可以添加实例方法、类方法、协议、属性(不能添加实例变量)。简单来说下Category的实现原理,其实就是运行时生成category_t结构体,将实例方法、类方法、协议、属性放入了objc_class的class_rw_t中,这样就实现了向类中加入了这些东西。下面从runtime源码方面深入了解Catetory的实现。

2.1 Category的内存结构

每个分类在编译后会生成一个category_t结构体,该结构体中存储着分类的实例方法、类方法、协议列表、属性等信息。具体struct如下图所示:

2.2 Category如何加载

对于OC的runtime,方法入口如下(ojbc-os-mm文件):

category被添加到类上面是在map_images发生的,又会调用_read_images方法,而在_read_images方法中,调用load_categories_nolock,有以下的代码:

由上图可知,调用了attachCategories的方法来将Category有关信息来绑定到cls中,具体代码如下:

由上图可知,将Catetory的方法、属性、协议添加到rw结构体的methods、properties、protocols属性中,并调用了attachLists方法。class_rw_ext_t结构代码如下:

对于method_array_t是C++的类,继承list_array_tt,这个结构中具体实现了attachLists方法,具体代码如下:

2.3 总结

1)category的方法的添加,并不是"完全替换"(只是插到了它的前面),也就是说如果category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA。

2)category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会停止,但是后面可能还有一样名字的方法。

3)category不能为class添加变量:

  • category本身就没有ivar

  • 在编译期间class的ro结构已经定好,运行时添加实例变量,会破坏原有的内存结构,甚至会覆盖下一个obj的isa指针。

三 category和关联对象

由第二章可知category里面是无法为class添加实例变量的,但是如果需要添加和对象相关联的值,可以使用关联对象来解决。

3.1 关联对象的使用

3.1.1 objc_setAssociatedObject

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

  • object是给某个对象

  • key是关联对象的key值

  • value是具体关联的对象值

  • policy是关联对象的存储属性

3.1.2 objc_getAssociatedObject

id objc_getAssociatedObject(id object, const void *key)

  • 返回值通过key得到的绑定对象

  • object是某个对象

  • key是关联对象所对应的key

3.2 关联对象的原理

关联对象其实所有的关联对象都由AssociationsManager管理,里面是由一个静态AssociationsHashMap来存储所有的关联对象的。这相当于把所有对象的关联对象都存在一个全局map里面。而map的的key是这个对象的指针地址(任意两个不同对象的指针地址一定是不同的),而这个map的value又是另外一个AssociationsHashMap,里面保存了关联对象的key->ObjcAssociation。AssociationsManager结构如下:

关联对象类图如下:

3.2.1 objc_setAssociatedObject

objc_setAssociatedObject在objc-runtime.mm文件中调用了objc-references.mm文件中的_object_set_associative_reference方法,具体代码如下:

3.2.1 objc_getAssociatedObject

objc_getAssociatedObject在objc-runtime.mm文件中调用了objc-references.mm文件中的_object_get_associative_reference方法,具体代码如下:

四、扩展

扩展并没有向分类一样,生成category_t数据结构,扩展中声明的方法、成员变量等都会直接添加到cls的结构中,所以扩展不同与分类,可以为类添加实例变量。扩展常用来定义一些私有的方法和属性,一般写在.m文件中。


文章转载自:

http://eZCvkExS.qmkyp.cn
http://xAD5TLv7.qmkyp.cn
http://dfx2PKNR.qmkyp.cn
http://EFpKiVpT.qmkyp.cn
http://67lwRXnm.qmkyp.cn
http://dsNbsK1H.qmkyp.cn
http://hjDPxbsq.qmkyp.cn
http://UFZmSUQw.qmkyp.cn
http://zFdErfVB.qmkyp.cn
http://yVz04UXM.qmkyp.cn
http://V48fKlLy.qmkyp.cn
http://7v8xn0if.qmkyp.cn
http://8AU3FAAM.qmkyp.cn
http://SFVt8uVf.qmkyp.cn
http://2jwUQF76.qmkyp.cn
http://ZDHRqwFO.qmkyp.cn
http://jXnIygbN.qmkyp.cn
http://ppewnKCF.qmkyp.cn
http://YNDXXpS2.qmkyp.cn
http://EN7imkvY.qmkyp.cn
http://pVy4pX69.qmkyp.cn
http://bsVTXKAx.qmkyp.cn
http://NWmcDMRr.qmkyp.cn
http://QCzIpWZf.qmkyp.cn
http://kjgoIziO.qmkyp.cn
http://Qbj9M341.qmkyp.cn
http://9za0fsba.qmkyp.cn
http://oEu3g8Jr.qmkyp.cn
http://R1bKjg3i.qmkyp.cn
http://lyYpgdoA.qmkyp.cn
http://www.dtcms.com/wzjs/678541.html

相关文章:

  • 海东商城网站建设windows优化大师会员
  • 服务器网站备案快速搭建网站 优帮云
  • 怎么给网站做spm网页制作东莞
  • 济南企业建站公司重庆工程公司有哪些
  • 网站免费建设怎样在网做旅游网站
  • 琼中网站建设wordpress调用子分类
  • 中细软网站建设跨境电商产品开发
  • 网站备案是 备案空间吗自己做网站别人怎么看见
  • dremrever怎么做网站怎么在wordpress免费注册博客网站
  • 吉林市做网站的公司网站上文章分享的代码怎么做的
  • 惠城网站建设有哪些企业网站建设的一般要素主要包括网站的
  • 怎样自学做网站国内开源网站
  • asp个人网站下载网站开发项目实训总结
  • 服务器搭建网站能ping t公民道德建设网站
  • 诗人做的网站温州系统开发
  • 道滘镇做网站百度北京公司地址全部
  • ic电子网站建设招聘页面设计
  • 网站建设哪家好就推 鹏博资讯织梦网站地图制作教程
  • 个人博客网站建设预算做网站用什么软件编辑
  • 如何上传文件到网站400电话实名制认证网站
  • 网站的建设方法包括什么作用网站底色什么颜色好看
  • 用vs2012做简单网站佛山营销网站开发怎么选
  • 模版网站是什么意思网站开发安全机制
  • 培睿网站开发与设计一起做网店类型的网站
  • 还有多少用.net做网站的门户网下载
  • 小米手机网站建设总结北京互联网公司聚集地
  • 旅游景区网站源码济南做html5网站
  • 建立外贸网站多少钱专业的常州网站建设
  • 网站开发asp软件有哪些南京做网站南京乐识专业
  • 平江区建设局网站建设网站工作报告