1.category和extension
类目只能为原有类添加方法,不可以添加实例变量(category不能给类添加实例变量。使用runtime的方式,可以添加属性字段。,通过运行时自定义setter和getter方法)。
category添加的方法不强制要求在implement文件中实现
extension声明的方法在implement文件中一定要实现
extension可以添加实例变量和属性变量。
extension常用的一个功能是,原类中readonly的属性变量,可以在extension中重新声明为readwrite。并且属性变量的读写方法都要在implement文件中实现。
2.autoreleasePool
3.runloop
4.block
5.runtime
Runtime运行时,OC的底层都是调用C语言的代码,OC调用方法包括alloc创建对象都是采用消息发送机制,objc_msgsend.
Objc_msgsend(class,SEL)
应用场景
1.在程序运行过程中,动态创建一个类(比如KVO的底层实现)
2.在程序运行过程中,动态地为某个类添加属性/方法。可以用于封装框架(想怎么改就怎么改) 这就是我们runtime机制的主要运用方向
3.遍历一个类中所有的成员变量(属性)/所有方法。(比如字典-模型:利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上;还有归档和接档,利用runtime遍历模型对象的所有属性)
4.Swizzling: 方法变换
6、@synthesize 和 @dynamic 分别有什么作用?
@property有两个对应的词,一个是@synthesize(合成实例变量),一个是@dynamic。
如果@synthesize和@dynamic都没有写,那么默认的就是 @synthesize var = _var;
// 在类的实现代码里通过 @synthesize 语法可以来指定实例变量的名字。(@synthesize var = _newVar;)
1. @synthesize 的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
2. @dynamic 告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成(如,@dynamic var)。
7、静态库和动态库的存在的形式
静态库:以.a 和 .framework为文件后缀名。
动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。(系统直接提供给我们的framework都是动态库!)
理解:.a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式
不同点:
静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
共同点:
静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息
8.使用Charles抓包
9.制作framework :
分为release和debug版本,开发一般用release版本
首先打开Xcode创建一个framework工程,选择cocoa TouchFramework,选择header
网友评论