Effective Objective-C chapter-1

熟悉 Objective-C

  1. Objective-C 通过一套全新的语法,在 C 语言的基础上添加了面向对象的特性。
  2. Objective-C 使用消息结构,由 Smalltalk 语言演化而来。
  3. 消息结构和函数调用的区别在于:使用消息结构的语言,其运行时所执行的代码由运行环境所决定;而使用函数调用的语言,则由编译器所决定。消息结构在运行时才回去查找所要执行的方法,编译器也不关心接收消息的对象是何种类型,在运行期才会去检查对象类型,这个过程称为“动态绑定”。
  4. Objective-C 的重要工作都是由“运行期组件”而非编译器来完成。使用 Objective-C 的面向对象特性所需的全部数据结构及函数都在运行期组件里面。运行期组件本质上是一种与开发者所编写代码相链接的“动态库”,其代码能把开发者所编写的所有程序粘合起来。
  5. Objective-C 的指针都是用来指示对象的,所有 Objective-C 语言的对象都必须使用指针来声明,对象所占的内存总是分配在“堆空间(heap space)”中,不能再栈中分配 Objective-C 对象,而对象的指针则是在栈中分配。分配在堆中的内存必须直接管理,而分配在栈上用于保存指针变量的内存会在其栈帧弹出时自动清理。
  6. Objective-C 将堆内存管理抽象了出来,不需要手动的 malloc 或者 free ,Objective-C 运行期环境将这一部分工作抽象为一套内存管理架构,名为“引用计数”

少引入头文件

  1. 在头文件中尽量使用“向前声明” ,在实现文件中在引入对应的头文件。将引入头文件的实际尽量延后,只有在确有需要的时候再去引入。
  2. 如果写的某个类继承自某个超类,则必须引入那个超类文件。同理,如果声明要写的类遵从某个协议(protocol),那么该协议也必须要有完整的定义,且不能使用向前声明。向前声明只能告诉编译器有某个协议,但是此时编译器需要知道该协议中的定义的方法。
  3. 委托协议(delegate protocol)则不需要单独写一个类,委托协议只有在与接受委托的类放在一起定义才有意义,此时最好能在实现文件中声明此类实现了该委托协议,并把这段实现代码放在“class-continuation”分类里。这样的话,只需要在实现文件中引入包含委托协议的头文件即可。否则,被外部引入的协议要单独放在一个文件中,然后再引入。

多用字面量语法

  1. 应该是要字面量语法来创建字符串,数值,数组,字典。
  2. 应该通过取下标操作来访问数组下标或字典中的键所对应的元素。
  3. 用字面量语法创建数组或字典时,若值中有 nil,则会抛出异常,务必确保值不为 nil。

多用类型常量,少用#define 预处理命令

  1. 类型常量的命名法是:如果常量局限于某“编译单元(也就是实现文件)”之内,则在变量前面加上 k,如果常量在类文件之外可见,则通常以类名作为前缀。
  2. 定义常量的位置,如果不打算公开某个常量,则应该将其定义在使用该变量的实现文件中。变量一定要同时使用 static 和 const 来声明,static 修饰符意味着变量的编译单元内可见,const 表示值不可变。
  3. 定义外部可见的全局常量的方法是:头文件中的声明方式extern NSString *const **,实现文件的定义方式 extern *const ** = @"*",这是在头文件中声明,在实现文件中定义。这类常量必须要定义,而且只能定义一次。

用枚举表示状态,选项,状态码

  1. 应该用枚举来表示状态机的状态、传递给方法的选项以及状态码的值,给这些值取个易懂的名字。
  2. 如果把传递给某个方法的选项表示为枚举类型,而多个选项又同时可用,那么就将各个选项的值定义为2的幂,一遍通过按位或操作将其组合起来
  3. 使用 NS_ENUM 与 NS_OPTIONS 宏来定义枚举类型,并指明其底层数据类型。这样做可以确保枚举是用开发者所选的底层数据类型实现出来的,而不会采用编译器所选择的类型。
  4. 在处理枚举类型的 switch 语句中不要实现 default 分支,这样的话,加入新的枚举之后,编译器就会及时提醒开发者还有没有实现的枚举分支。
发布了227 篇原创文章 · 获赞 319 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/hu1020935219/article/details/70238920