下载地址:Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法
熟悉Objective-C
1. 了解Objective-C
1.1 动态语言与静态语言
Objective-C与其他如C++、Java语言的在方法调用上的区别,前者是消息结构型,而后者是函数调用型。
前者体现了动态语言的特点,在运行中动态的绑定消息的接受者,编译器不关心消息接受对象的类型,并且,消息接受后执行的逻辑也要在运行时处理。
函数调用型则是在编译时,通过虚函数表查询具体执行哪一个函数。
因此,OC的重要工作都需要通过“运行时”组件来执行。
1.2 内存管理
对象所占的内存总是分配在“堆空间”,而不是在“栈空间”,存在栈中的是对象的“指针”
分配在堆中的数据需要进行内存管理,而栈中的保存对象地址的指针会随栈帧弹出而自动清理。
OC使用引用计数的方式来管理内存
2. 在类的头文件中尽量少的引用其他头文件
在头文件中使用@Class声明类,在实现文件中再真正引用其头文件。
这样的做法一方面可一件收编译时所需要的开销,另外也可以避免两个文件在编译的时候循环引用造成编译错误。
在头文件中要使用协议的时候,可能会要引用别的文件,此时最好把协议单独写在某个头文件中,减轻编译负担。
当需要声明一个对象遵守某项协议时,应该把这项声明写进分类中。
3. 多使用字面量语法
即:使用
@10、@[@10, @"10"]、@{@"name": @"jim"}
不使用
[NSNumber numberWithInt:1]...
表意清晰,代码整洁
4. 多用类型常量,少用 #define 预处理指令
使用预处理指令因为声明中不包含变量类型,只会编译时查找和替换,即使有人重新定义了常量,编译时也不会报错。
不需要外界调用的,以 static const 写在实现文件中。
需要外界调用的,使用extern声明在头文件中,并且在命名时加上模块的名称。
5. 用枚举表示状态、选项、状态码
通过位运算组合枚举值:
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, // 001
UIViewAutoresizingFlexibleWidth = 1 << 1, // 010
使用typeof NS_EMUN或NS_OPTIONS宏来定义枚举类型,并且指明数据类型,以确保开发者使用的是底层数据类型,而不是编译器默认选取的数据类型。