


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Swift和0bjective-C运行时刖弓Swift和0bjective-C运行时即使不写一行OC(Objective-C)代码,每个Swfit应用还是执行在0C运行时内部,打开一个动态调度的世界和有关的运行时操作。的确,项目只用Swift框架的情况不总是存在,但一旦这种情况来临,可能就会出现运行时内只存在Swift而没有0C。只要0C运行时一直存在,咱们就该发挥它的全部潜力。注:文章主要涉及两种技术在Swift的使用,如想详细了解请点击上述链接。关联对象(AssociatedObjects)Swift扩展对于在现有Cocoa类中添加功能函数有极大地灵活性,但就像Swift同胞0C的类别(c
2、ategory)样,扩展是有限制的。也就是说,通过扩展也不能对现有的类添加属性。令人欣慰的是,0C关联对象可实现对现有类添加属性。例如,为了在工程内对所有viewControllers添加名为descriptiveName属性,我们只需简单地在属性的get及set方法中使用objc_get/setAssociatedObject()方法添加属性。extensionUIViewControllerprivatestructAssociatedKeysstaticvarDescriptiveName=nsh_DescriptiveNamevardescriptiveName:String?getr
3、eturnobjc_getAssociatedObject(self,&AssociatedKeys.DescriptiveName)as?StringsetifletnewValue=newValueobjc_setAssociatedObject(self,&AssociatedKeys.DescriptiveName,newValueasNSString?,OBJC_ASSOCIATION_RETAIN_NONATOMIC)注意使用私有嵌套的结构体内的staticvar变量,这样做创建了需要的一个静态的关联对象键值而且不会污染全局命名空间。方法置换(MethodSwizzling)有时为
4、了方便,有时为了解决框架的bug,有时因为没有其他方法,需要改变已存在类的方法的实现。方法置换可以交换两个方法的实现,最重要的是覆盖已存在的方法的同时不改变原方法的实现。在本例中,通过改变UIViewControllersviewWillAppear方法的实现在任何界面即将出现时打印一条信息。置换发生在类的静态initialize方法,替换的实现是在nsh_viewWillAppear方法中:letoriginalMethod=class_getlnstanceMethod(self,originalSelector)letswizzledMethod=class_getInstanceMet
5、hod(self,swizzledSelector)letdidAddMethod=class_addMethod(self,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod)/MARK:-MethodSwizzlingextensionUlViewControllerpublicoverrideclassfuncinitialize。structStaticstaticvartoken:dispatch_once_t=0/makesurethisisn
6、tasubclassifself!=UIViewController.selfreturndispatch_once(&Static.token)letoriginalSelector=Selector(viewWillAppear:)letswizzledSelector=Selector(nsh_viewWillAppear:)ifdidAddMethodclass_replaceMethod(self,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEncoding(originalMetho
7、d)elsemethod_exchangelmplementations(originalMethod,swizzledMethod)funcnsh_viewWillAppear(animated:Bool)self.nsh_viewWillAppear(animated)ifletname=self.descriptiveNameprint(viewWillAppear:(name)elseprint(viewWillAppear:(self)loadvsinitialize(Swift版本)OC运行时在加载和初始化应用类过程中通常会自动调用两个类方法:gd和initialize。在文章me
8、thodswizzling中,Mattt指出从安全和便利角度,替换过程通常应该在load方法内。load方法每个类只会调用一次,且是在加载类时被调用。从另外方面,initialize方法能被类及其子类(对于UlViewController来说很可能存在)调用,但在没有任何消息发送到该类情况下,initialize不会被调用。不幸的是,Swift在运行时不会调用load方法,所以Mattt推荐的方式不能实现。作为替代,我们选择了次优方法:在initialize方法中做置换这种实现是安全的,只要你在运行时检查好类型且用dispatch_once包裹置换方法。在appdelegate中做置换不通过类扩展添加置换方法,而简单的把替换过程在application(_:didF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年开封运输从业资格证考试技巧
- 农业设备供货合同范本
- 劳动合同范本大全
- 2025年运城货运上岗证模拟考试试题
- 专利侵权检索合同范本
- 买卖废钢材合同范本
- 劳务合同范本无社保
- 临泉教师合同范本
- 三人合作协议合同范本
- 交电产品销售合同范例
- 2025包头青山宾馆有限公司面向社会公开招聘18人笔试参考题库附带答案详解
- 课件-DeepSeek从入门到精通
- 2025年业务员工作总结及工作计划模版(3篇)
- 2025至2030年中国毛绒卡通玩具数据监测研究报告
- 2024年连云港市赣榆区区属国企对外招聘笔试真题
- 海南省海口市2024-2025学年八年级上学期期末考试数学试题(含答案)
- 2025年度智能充电桩场地租赁合同范本3篇
- 17J008挡土墙(重力式、衡重式、悬臂式)图示图集
- 药品类体外诊断试剂专项培训课件
- 心电监护仪的操作及注意事项 课件
- 细胞生物学(全套1047张课件)
评论
0/150
提交评论