美文网首页
《Effective Objective-C 2.0》摘抄(1)

《Effective Objective-C 2.0》摘抄(1)

作者: ReidWang | 来源:发表于2016-12-01 11:19 被阅读5次

    1、多用类型常量,少用 #define 预处理指令

    #define ANIMTION_DURATION 0.3  ❌

    static const NSTimeInterval  kAnimationDuration = 0.3 😊

    ⚠️1.1、 用 类型常量 时注意常量的名称,若常量局限于某 “编译单元”(translation unit,也就是 “实现文件”, implementation file)之内,则在前面加字母 k ;若常量在类之外可见,则通常以类名为前缀。

    ⚠️1.2、变量一定要同时使用 static 与 const 来声明。如果试图修改由 const 修饰符所声明的变量,那么编译器就会报错,static 修饰符则意味着该变量仅在定义次变量的编译单元中可见。

    ⚠️1.3、有时候需要对外公开某个常量。比方说,你可能要在类代码中调用 NSNOtificationCenter 以通知他人。用一个对象来派发通知,令其他与接收通知的对象向该对象注册,这样就能实现此功能了。派发通知时需要使用字符串来表示此通知的名称,而这个名字就可以声明为一个外界可见的常值变量。这样的话,注册者无须知道实际字符串值,只需要以常值变量来注册自己想要接收的通知即可。此类常量需放在 “全局符号表” 中,以便可以在定义该变量的编译单元之外使用,其定义方式为:

    // In the header file

    extern NSString *const EOCStringConstant;

    // In the implementation file

    NSString *const EOCStringConstant = @"value";

    1.4、要点:

     1.4.1、不要用预处理指令定义常量,这样定义出来的常量不含类性信息,编译器只是会在编译前据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。

    1.4.2、在实现文件中使用 static const 来定义 “只在编译单元内可见的常量”,由于此类常量不在全局符号表中,所以无需为其名称加前缀。

    1.4.3、在头文件中使用 extern 来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应该加以区隔,通常与之相关的类名做前缀。

    2、属性的内存管理语义

    2.1、assign “设置方法” 只会执行针对 “纯量类性” 的简单赋值操作。

    strong 此特质表明该属性定义了一种 “拥有关系” 为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。

    weak 此特质表明该属性拥有了一种 “非拥有关系”。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同 assign 类似,然而在属性所指的对象遭到摧毁时,属性值也会清空。

    unsafe_unretained 此特质的语义和 assign 相同,但是它适用于 “对象类型”,改特质表达一种 “非拥有关系”,当目标对象遭到摧毁时,属性值不会自动清空,这一点与 weak 有区别。

    copy 此特质多表达的所属关系与 strong 类似。然而设置方法方法并不保留新值,而是将其 “拷贝” 。当属性类型为 NSString * 时,经常用此特质来保护其封装行,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。这个类是 NSString 的子类,表示一种可以修改其值的字符串,此时若不是拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改,所以这时就要拷贝一份“不可变”的字符串,确保对象中的字符串值,不会无意间变动。只要实现属性所用的对象是 “可变的”,就应该在设置新属性值时拷贝一份。

    相关文章

      网友评论

          本文标题:《Effective Objective-C 2.0》摘抄(1)

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