美文网首页寒哥管理的技术专题work我的iOS开发小屋
关于Effective Objective-C 这本书一些有趣的

关于Effective Objective-C 这本书一些有趣的

作者: pengxuyuan | 来源:发表于2017-06-16 10:31 被阅读1172次

    前言

    前段时间把Effective Objective-C 这本书慢慢的看了下,记录每章一些需要注意的知识点。说实话,这本书籍写的真的是经典,我感觉过段时间还得细读一遍。

    目前对于每章的记录,有点类似流水账,就是粗略的记录知识点,方便快速浏览,希望过段时间可以慢慢思考每章每个知识点。

    Effective Objective-C 2.0 总结(一)

    Effective Objective-C 2.0 总结(二)

    Effective Objective-C 2.0 总结(三)

    Effective Objective-C 2.0 总结(四)

    Effective Objective-C 2.0 总结(五)

    Effective Objective-C 2.0 总结(六)

    Effective Objective-C 2.0 总结(七)

    正文

    这里记录下在读这本书一些有趣的东西,可以在平时编码的时候注意

    利用@class 向前声明 来解决两个类相互引用的问题

    A 类中有B 类的属性,B 类中也有A 类的属性;在这种情况下,我们用import、include 都是不能解决的,用@class 就可以完美解决这个问题,而且用@class 还可以减少对其他类的依赖,减少链接其他类所需要的时间,从而降低编译时间

    读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做

    通过属性来访问其实就调用set/get 方法,用实例变量来访问其实就是利用指针直接操作,这样子不用经过Objective-C 的 “方法派发” 步骤,这样子速度会比较快= =

    Cocoa 中大部分collection 类都是类族

    类族使用 “工厂模式”,调用抽象基类方法返回子类实例,这样子可以隐藏子类实现的细节,但是要注意,我们这样子用基类生成的实例,很有可能并不是基类的实例而是子类的实例,这个时候我们要弄清楚这两个方法的区别

    -(BOOL) isKindOfClass: classObj; 判断是否是这个类或者这个类的子类的实例
    -(BOOL) isMemberOfClass: classObj; 判断是否是这个类的实例
    

    关于 “协议” 可选方法的判断

    在实现委托模式和数据源模式的时,协议中的方法是可选的,我们就会写出大量这种判断代码:

    if([_delegate respondsToSelector:@selector(networkFetcher:didRecevieData:)]){
        [_delegate networkFetcher:self didRecevieData:data];
    }
    
    • 每次调用方法都会判断一次,其实除了第一次检测的结构有用,后续的检测很有可能都是多余的,因为委托对象本身没变,不太可能会一下子不响应,一下子响应的,所以我们这里可以把这个委托对象能否响应某个协议方法记录下来,以优化程序效率。
    • 将方法响应能力缓存起来的最佳途径是使用 “位段”(bitfield)数据类型。我们可以把结构体中某个字段所占用的二进制位个数设为特定的值。

    位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。

    struct data {

    ​ unsigned int filedA : 8;

    ​ unsigned int filedB : 4;

    ​ unsigned int filedC : 2;

    ​ unsigned int filedD : 1;

    }

    filedA 位段占用8个二进制位,filedB 位段占用4个二进制位,filedC 位段占用2个二进制位,filedD位段占用1个二进制位。filedA 就可以表示0至255之间的值,而filedD 则可以表示0或1这两个值。

    我们可以像filedD 这样子,创建大小只有1的位段,这样子就可以把Boolean 值塞入这一小块数据里面,这里很适合这样子做。

    • 利用位段就可以清楚的表示delegate 对象是否能响应协议中的方法。

      @interface EOCNetworkingFetcher ()
      struct {
        unsigned int didReceiveData : 1;
        unsigned int didFailWithError : 1;
        unsigned int didUpdateProgressTo : 1;
      } _delegateFlags
      @end
        
      //使用
      //set flag
      _delageteFlags.didReceiveData = 1;
      
      //check flag
      if(_delageteFlags.didReceiveData){
        //YES
      }
      
    • 可以在delegate 属性的设置方法里面写实现缓存功能所用的代码。

    • 这样子,每次调用delegate 的相关方法之前,就不用检测委托对象是否能响应给定的选择子了,而是直接查询结构体里面的标志。

    • 在相关方法需要调用很多次时,就要思考是否有必要进行优化,分析代码性能,找出瓶颈,使用这个位段这个技术可以提供执行速度。

    使用atomic 特质来修饰属性,来保证其原子性 但是不代表是线程安全的

    属性是开发者经常需要同步的地方,可以使用atomic 特质来修饰属性,来保证其原子性,每次肯定可以从中获取到有效值,然而在同一个线程上多次调用获取方法(getter),每次获取到结果未必相同,在两次访问操作之间,其他线程可能会写入新的属性值。

    使用 “串行同步队列”,将读取操作及写入操作都安排在同一个队列里,即可保证数据同步。

    对于NSTimer 设置tolerance 这个偏差时间 可以提高性能

    最后

    这次看完,感觉对很多知识点都了解的不深,很多原理性的东西完全不懂,还是得多加把劲呀。

    最后,还是推荐大家去看原著 少数优秀的Objective-C 书籍之一 = =

    努力,奋斗!

    相关文章

      网友评论

        本文标题:关于Effective Objective-C 这本书一些有趣的

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