美文网首页iOS精选
Effective Objective-C 2.0读书笔记(7)

Effective Objective-C 2.0读书笔记(7)

作者: _桃夭大人_ | 来源:发表于2019-02-21 13:14 被阅读15次

    第七章 系统框架

    第四十七条:熟悉系统框架

    iOS应用程序中不允许使用 自定义的动态库,一般都是静态库,系统框架是动态库。

    • 系统框架

    Foundation 提供基础核心功能
    CoreFoundation C语言API
    CFNetwork 提供C语言级别的网络通信能力,他将“BSD socket”抽象成易于使用的网络接口。
    AVFoundation 回访录制音视频
    coreAudio 提供C语言API可用来操作设备上的音视频硬件
    coreData 可将对象放入数据库 便于永久保存。
    coreText 可以高效执行文字排版以及渲染操作。

    UIKit APPKit UI框架
    CoreAnimation 渲染图形并播放动画
    CoreGraphics 框架 C语言框架,提供2D渲染所必备蹲的数据结构与函数。

    第四十八条:多用块枚举,少用for循环

    • for循环

    • NSEnumerator遍历
      优势在于不论遍历那种类型 都采用相近的语法,有多种“枚举器”(如:objectEnumerator,reverseObjectEnumerator,keyEnumerator)

    NSEnumerator * enum = [array objectEnumerator];
    id object;
    while((object = [enum nextObject] != nil)){
    
    }
    
    • 快速遍历 for in

    • 基于块的遍历方式

    // 好处:
    //(1) 遍历时 既能知道对象 也能知道下标 stop终止遍历
    // (2)能够修改 块的方法类型
    - (void)enumerateObjectsUsingBlock:(void(^)(id object,NSUInteger idx,BOOL * stop))block;
    

    第四十九条:对自定义 其内存管理语义的collection使用无缝桥接

    使用“无缝桥接”技术,可以在定义于Foundation框架中的Objective-C类和定义于CoreFoundation框架中的C数据结构之间相互转换。
    “桥式转换”:

    • __bridge 告诉ARC如何处理转换所涉及的Objective-C对象;ARC仍然具备这个Objective-C对象的所有权。
    • __bridge_retained ARC将交出对象的所有权。
    • __bridge_transfer 反向转换
    image.png

    第五十条:构建缓存时 选用NSCache而非NSDictionary

    • NSCache 用来缓存资源,当系统资源将要耗尽时,它可以自动删减缓存,优先删减“最久未使用的缓存”。

    • NSCache 不会“拷贝”键,而是“保留”键。

    • NSCache 是线程安全的。多个线程可以同时访问NSCache。

    • NSCache 可以控制缓存删减内容的时机:可调整
      (1)缓存中对象总数;
      (2)所有对象的“总开销”;

    • NSPurgeableData类
      当系统资源紧张时,可以把保存NSpureableData对象的那块内存释放掉。
      // beginContentAccess :告诉他 现在不应该丢弃自己所占用的内存。
      // endContentAccess :告诉他用完了,在必要时可以丢弃自己所占据的内存。



    第五十一条:精简initialize 与 load的实现代码

    • +(void)load;
      load方法的问题在于:执行该方法时,运行期系统处于“脆弱状态”。无法确定个各类的载入顺序,因此,在load方法中使用其他类是不安全的。


      image.png

    无法确定EOCClassA 是不是已经加载好了!!!EOCClassA可能在load中执行某些重要操作。

    load不遵循继承规则,整个应用程序在执行load方法时都会阻塞。

    • +(void)initialize
      该方法会在程序首次用该类之前调用,且只调用一次。由运行期系统来调用。“惰性调用”,initialize方法只应该用来设置内部数据。
      ** 线程安全 **
      只有执行initialize的那个线程,可以操作类或者类的实例。其他线程都要阻塞等待initialize执行完。
      遵循继承规则

    简化的原因:
    (1)初始化期间会一直阻塞
    (2)无法控制累的初始化时机
    (3)如果某个类的实现代码很复杂,那么其中可能会直接或者间接用到其他类。

    第五十二条 别忘了NSTimer会保留其目标对象

    只有把计数器放到运行循环里,它才能正常触发任务。

    // 此方法创建出来的计时器,会在指定时间间隔之后执行任务
    + (NSTimer *)schedledtimerWithTimeInterval:(NSTimeInterval)secondes target:(id)target selector:(SEL)selector userInfo:(id)userInfo repeats:(BOOL)repeats;
    

    由于计时器会保留其目标对象,所以反复执行任务 ,很容易引入“保留环”,通常会导致应用程序出问题。

    • NSTimer对象会保留其目标,直到计时器本身失效为止,调用invalidate方法可以令计时器失效。另外一次性的计时器在触发完任务后也会失效。
    • 反复执行任务的计时器,很容易引入保留环,如果这种计时器的目标对象有保留了计时器本身,那肯定会导致保留环。
    • 可以扩充NSTimer的功能,用“块”来打破保留环,不过,除非NSTimer将来在公共接口里提供此功能,否则必须创建分类,实现代码。


    相关文章

      网友评论

        本文标题:Effective Objective-C 2.0读书笔记(7)

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