runtime(运行时) 官方:iOS黑魔法面试
1.OC运行时候转化为了runtime运行时候的C语言代码swift
2.是一套C语言的API (C语言函数库)数组
动态库/静态库安全
静态库:独立库 一个项目中包含了这个库网络
动态库:共享库 一个项目中不包含库app
iOS伪后台 :应用程序被挂起 只有特定的几个能够运行(loaction 应用 网络通话)只有这三种才能够框架
iOS是伪后台 其实也就是单进程 同一时间只有一个app运行 故此时此刻 因此通常是苹果是静态库函数
2014年之前 iOS程序里面是不支持动态库的,库克开放了不少动态库性能
swift的出现了开始 动态库出现了在了iOS的世界 苹果的一大突破spa
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.能够经过返回一个数组指针 但考你指针传递
惟一的方法 让它的指针做为函数的参数