Effective Object C 2.0 『熟悉Object C』

234 阅读3分钟

第1条:Object C的起源

Object C是消息结构的语言,运行时所应执行的代码由运行时环境决定的。在运行时才会去查找要执行的方法,并不是由编译的时候决定的。其实现原理是由运行期组件完成(runtime component),使用Objective C的面向对象特性所需的全部数据结构以及函数都在运行期组件里面。运行期组件本质上是一种与开发者所编写的代码相链接的动态库(dynamic library),其代码能把开发者所编写的所有程序粘合起来,所以只要更新运行期组件,就可以提升应用程序性能 。

Object C的对象分配到堆,对象的指针分配到栈中(32位的系统占4个字节,64位系统占8个字节)。分配到都堆中的内存必须直接管理,分配到栈中用于保存变量的内存则会在其栈帧弹出时自动清理。

有时会遇到定义里不含*的变量,它们可能会使用『栈空间』,例如CGRect C的结构体。

第2条:类的头文件中尽量少引入其它的头文件

如果类的头文件中要声明其它类的属性,如只需要其类型不需要知道该类的全部实现细节,则只要使用『向前声明』即可,例如在类的头文件中引入 @class SomeClass,这样可以减少编译的时间。但如果类的实现文件.m中要使用后者的时候,则需要引入该类的头文件使用#import。

protocol尽量放单独的头文件中,如放到某类的头文件中,如其它类要遵循此协议则需引入类的全部内容,产生相互依赖,增加编译时间。

第3条:多用字面量语法,少用与之等价的语法

//no
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"kitty",@"name",@"1353**94618",@"number", nil];
NSString *str = [[NSString alloc] initWithString:@"hello kitty"];

//yes
NSNumber *intNumber = @10 ;
NSString *someString = @"hello";
NSArray *someArray =@[@"1",@"2"];
NSDictionary *someDictionary = @{@"one" : @"1",
                                 @"two" : @"2"};

字面量简洁,易读

字面量也有不足的地方,它不能表达可变类型,但可以直接在不可变对象使用copy方法,如下:
NSMutableDictionary *someMutableDictionary = [@{@"one" : @"1",
                                                @"two" : @"2"} mutableCopy];

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

使用预处理指令如下:

#define ANIMATION_DURATION  0.3 

预处理指令的处理方式是,在引用它的地方将所有跟ANIMATION_DURATION一样的字符串都替换为0.3,所以不太推荐此种做法。用声明常量的方式来替代宏,明显更为妥当。

//声明一个NSTimeInterval的常量
/*
static标明在此编译单元可见(.m文件内),如果不声明,编译器会为它创建一个『外部符号』,如在别的编译单元内有声明同样名称的变量,会编译报错;const声明变量值不可被修改。
*/
static const NSTimeInterval KAnimitionDuration = 0.3; 

第5条:用枚举表示状态、选项、状态码

//表示网络状态的状态枚举
typedef NS_ENUM(NSInteger,NCNetworkStatus) {
    NCNetworkStatusConnected,   //默认为0,除非指定值
    NCNetworkStatusConnecting,
    NCNetworkStatusdisConnected
};
//
NCNetworkStatus status = NCNetworkStatusdisConnected; 
switch (status) {
        case NCNetworkStatusConnected:
        { 
        }
            break;
        case NCNetworkStatusConnecting:
        { 
        }
            break;
        case NCNetworkStatusdisConnected:
        {
        }
            break;
            
        default: //这里不要增加选项,否则当我们在枚举增加选项时而没实现是有编译提示的,以防我们遗忘新增选项相关的逻辑处理
            break;
    }

//选项的枚举,可使用位操作来表示选项组合
typedef NS_OPTIONS(NSUInteger, NCDirection) {
    NCDirectionNone                 = 0,
    NCDirectionUp                   = 1 << 0,
    NCDirectionDown                 = 1 << 1,
    NCDirectionLeft                 = 1 << 2,
    NCDirectionRight                = 1 << 3
};

NCDirection direction = NCDirectionUp | NCDirectionLeft; //值为5,就可以判断为是上与左的组合选项了