集锦1

作者: 使徒行者24 | 来源:发表于2018-09-10 10:45 被阅读0次

    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

    相关文章

      网友评论

          本文标题:集锦1

          本文链接:https://www.haomeiwen.com/subject/nsajgftx.html