iOS的runtime黑魔法

runtime(运行时) 官方:iOS黑魔法

1.OC运行时候转化为了runtime运行时候的C语言代码

2.是一套C语言的API (C语言函数库)

 

动态库/静态库

静态库:独立库  一个项目中包含了这个库

动态库:共享库   一个项目中不包含库

 

iOS伪后台 :应用程序被挂起    只有特定的几个可以运行(loaction   应用   网络通话)只有这三种才可以

iOS是伪后台 其实也就是单进程  同一时间只有一个app运行   故此时此刻 所以一般是苹果是静态库

 

 

2014年以前 iOS程序里面是不支持动态库的,库克开放了很多动态库

swift的出现了开始  动态库出现了在了iOS的世界   苹果的一大突破

iOS要慢慢的开源  

 

OC的程序是怎么变成C语言的代码   ?????

OS X  --command 命令行----

hs—cd到main.m目录   

手动变异   hs clang 变异完了多了一个main.cpp  你可以看到一个代码

 

通过objc_msgSend 发送了一个名字为 sel_egisterName的消息

 

如何手写runtime运行时代码?????

 

 

 

runtime有什么作用????????????

1.runtime是一个OC的底层实现 ,用起来麻烦  性能很高 而且它能完成OC永远无法完成的功能

2.程序运行的过程中,帮你动态的创建一个类 

3,在程序的运行过程中   动态为某个类添加属性 和方法  修改属性 和方法

4.遍历一个类的所有成员变量(NB的框架用到了,字典转模型框架MJExtension和JSONModel用到了)

大量用到了runtime运行时

5.runtime重要使用场景 归档

 

 

 

 

 

egg:如何去使用runtime ?????

两个门牌号头文件: <objc/runtime>   <objc/message>

runtime必备常识:1. Method 成员方法         2. Ivar  成员属性  

其实还有分类和属性    

打开Xcode       创建一个iOS应用         

 

步骤:

1.导入<objc/runtime>   <objc/message>头文件

2.可以去修改头文件单加注释  一般不要修改        UIKIt框架可以做一个备份 进去了吧Header可以拷贝一份

3.进去官方文档  runtime --Objec-c Runtime Reference

里面有很多方法    ---class_copyIvarList 成员变量列表拷贝  返回值是一个 Ivar *  在C语言里面 Ivar是一个结构体   这个是一个结构体指针     指针的操作和数组差不多   给他一个角标的会指向不同的东西    C语言指针的特色和特点    

 

还有个函数     ---class_copyMethodList

创建一个Person 里面有一些属性

 

三种方法去拿到类的属性  

1.倒入头文件   

2.NSClassFromString(通过字符串返回class) 这个在main.m文件中

3。这个方法不用导入头文件就可以    用一个指针传递 Outcount 通过指针去改变对应内存中count的值

 

 

获取到了成员变量的个数

接下来拿到每一个成员变量

 

连对象都没有创建 就可以拿到她的成员变量 

ivars[0]返回一个 Ivar   *ivar = ivars[0];

Ivar是Runtime的成员变量    Ivar_getName(ivar)不会产生一个数据越界的问题   

Ivar_getName(ivar)能得到一个const char * 类型  可以打印出来的他的属性  

 

字典转模型  遍历的每一个属性的万一你的

 

 

最后进去一个Person的.m文件    外界一般是不能访问的 

这样你在.m加上interface  你可以随意加上属性  然后你就可以通过runtime在里面T拿到添加的属性

 

你可以对PageControl控件的6个属性 

你想把pageControl下面的小点点 修改成正方形  你怎么修改?????

你可以的拿到她的属性用KVC  setvalueforkey   私有的API不能上线 但是runtime可以上线     pagrcontrol去改的话应该可以上线

 

 

归档的runtime使用

command +L  加上 你想跳的行

 

如何将属性Person *p的p归档

归档的话先拿到沙盒路径        

NSString *DocPath = NSSsearchPath。。。。。。。。  返回了数组   里面一堆路径 然后来易个first或者last

一个项目中Docment只有一个  

 

 

归档   1个协议和2个方法

当你的项目卸载了  你可以做一个接档的过程就可以拿出来你存储的数据   不安全 这是个数据的持久化

如何将归档用到极致????????

归档的前提是  归档一个OC对象的底层原理是  

1.OC对象有属性   将属性拆分出来   拆分为字典     NSString :Value       

  然后将这些字典  KVC写入文件 

 

2.在实际开发中一般是去归档模型  里面的属性太多了  怎么去写

如何让归档变得很简单???????

这个时候你可以新建一个类   HankCoding 

HankCoding里面去遵守一个协议  (自定义的协议)   然后去实现两个方法

这个里面的话你可以用runtime       导入头文件

在这个里面实现升级

 

当使用C语言函数的时候   应该new   Creat 和Copy 应该要释放   你因该注意到一个的内存管理的问题    不接受ARC

指针你干不掉   你应该在最后加上free(ivars)

 

这个时候你可以去删掉原来的协议   去继承 HKCodeing    HKCodeing继承NSCoding

这个时候的字节数  里面有数据

 

 

 

 

 

面试题:

如何让C语言的函数有多个返回值???????

1.可以通过返回一个数组指针  但考你指针传递

唯一的方法  让它的指针作为函数的参数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  •  
posted @ 2016-06-17 09:55  Ninesday  阅读(307)  评论(0编辑  收藏  举报