OC进阶必读_Effective Objective-C 2.0书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Effective Objective-C 2.0 > OC进阶必读
良呵呵 Effective Objective-C 2.0 的书评 发表时间:2015-08-23 22:08:42

OC进阶必读

笔记

2.在类的头文件中尽量少引用其他头文件

        1.尽量使用向前声明@class
        2.委托协议直接写在类中
        3.公共协议抽写成单独文件
        4.在分类中引用协议

3.多使用字面量语法

        1.常量 @"abc" @1 @1.2f @YES @'a' @(x+y)
        2.数组 @[@"one",@"two",@"three"]
        3.字典 @{@"firstname":@"peng",@"lastname":"yuliang",@"age":@100}
        4.可变 NSMutableArray *arrM=[@[@"one",@"two"] mutableCopy];
        5.结构体 CGSize size={1,3};

4.多用类型常量,少用#define预处理指令

        1.只在编译单元内可见的常量(k开头)
                .m
                        static const int kNum=256;
                        static NSString *const kID=@"ID";//从右往左读

        2.全局常量(以类名打头)
                .h
                        extern NSString *const ClassNameID;
                        @interface ClassName:NSObject
                        @end
                .m
                        NSString *const ClassNameID=@"ID"
                        @implementation ClassName
                        @end

5.用枚举表示状态、选项、状态码

        1.2的幂枚举实现多选
                
                enum Direction{
                    kNone = 0,
                    kUp = 1<<0,
                    kDown = 1<<1,
                    kLeft = 1<<2,
                    kRight = 1<<3
                };

                Direction dir=kUp|kLeft;//按位或
                
                if (dir&kUp) {//按位与
            NSLog(@"up");
        }
        
        if (dir&kDown) {
            NSLog(@"down");
        }

    2.如果枚举不需要互相组合,使用NS_ENUM ("可指明其底层数据类型")
                
                typedef NS_ENUM(short, Direction){
                        kUp,
                        kDown,
                        kLeft,
                        kRight
                };

        3.如果枚举需要互相组合,使用NS_OPTIONS ("主要是为了屏蔽不同编译器差异,底层进行了宏判断")

                typedef NS_OPTIONS(NSInteger, Direction) {
                    kUp = 1<<0,
                    kDown = 1<<1,
                    kLeft = 1<<2,
                    kRight = 1<<3
                };

6.@property

        1.正确使用属性@property的attribute语义定义
        2.iOS中使用nonatomic,因为默认atomic会严重影响性能

7.在对象内部尽量直接访问实例变量,属性存取本质都要经过消息传递调用
        
        1.对象内部直接通过实例变量读,copy属性需要通过属性写,需要KVO监测的通过属性写
        2.在初始化方法或dealloc中,总是应该直接通过实例变量来读写数据
        3.实现"懒加载(惰性初始化)"的,通过属性读取

8.对象等同性监测

        1.isEqualToString:速度要比isEqual:快,类似有isEqualToArray:isEqualToDictionary
        2.若要检测对象等同性,请提供isEqual:与hash方法
        3.两个对象相同则哈希码相同,哈希码相同的两个对象不一定相同
        4.编写hash方法时,应该使用计算速度快而且哈希码碰撞几率低的算法

9.以"类族模式"隐藏实现细节(class cluster)
        
        1.工厂模式是创建类族的方法之一
        2.Cooca中有许多类族,大部分collection类都是类族

10.使用前缀避免命名空间冲突

        1.3个字母以上,因为苹果公司保留使用所有两个字母前缀的权利
        2.给所有类、分类、分类方法、.m中C函数、全局变量等使用前缀
        3.使用第三方库也加上前缀

11.提供"全能初始化方法"

        1.在类中提供一个全能初始化方法,并于文档里指明。其他初始化方法均调用此方法
        2.若全能初始化方法与超类不同,则需要覆写超类中的对应方法
        3.如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常

12.尽量创建不可变对象

13.使用清晰而协调的命名方式

14.自动引用计数ARC
        
        1.ARC不是用的消息转发机制调用retain、release等而是直接调用的底层与之等价的C函数objc_retain等提升性能
        2.ARC有时甚至比手动更优化,比如如果一个对象被多次retain release,ARC可以精简这个过程成对移除这些操作
        3.ARC还有运行时组件进一步优化性能

        ARC开启异常捕获生成安全处理异常所需的清理的代码 -fobjc-arc-exceptions,不过会影响性能,默认关闭

15.扩展中改变只读属性可读写使之可内部赋值

16.用handler块降低代码分散程度

17.多用派发队列少用同步锁

18.多用GCD,少用performSelector系列方法

19.多用块枚举,少用for循环
        
        NSArray *arr=@[@"one",@"two",@"three"];
        
    [arr enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse usingBlock:^(NSString * obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@",obj);
    }];

    NSEnumerationConcurrent //开启块并发执行

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读