编写高质量代码-OC 第1章 让本身习惯OC

一、视Objective-C为一门动态语言
虽然OC和C++都是在C的基础上加入面向对象特性扩充而成的程序设计语言,OC基于动态运行时类型,而C++基于静态类型。OC编写的程序不能直接编译成可以使机器语言(二进制编码),而是在程序运行时,经过运行时(Runtime)把程序转译成可令机器读懂的机器语言。数组

  • Objective-C是动态语言,C++是静态语言
  • 静态语言执行效率和安全性要比动态语言高,但其简便性没有动态语言高
  • 运行时(Runtime)环境可处理弱类型、函数存在检查工做,会检测注册列表里是否存在对应的函数,类型是否正确,最后肯定正确的函数地址,再进行保存寄存器状态、压栈、函数调用等实际操做,确保了objective-C的灵活性。

二、在头文件中尽可能减小其余头文件的使用安全

  • 在头文件(.h)中,关键字“@class”,只是为了在头文件中引用这个类,把这个类做为一个类型来用,这就要求引用的头文件(.h)名与类的名称同样
  • 在头文件(.h)中使用“@class”,在源文件中使用“#import”,不但能够减小没必要要的编译时间,下降类之间的耦合度,并且还能够避免循环引用。
  • 在设计类时,尽可能多采用协议,避免#import过多,引用没必要要的部分。
  • 若是头文件(.h)中有多个类的定义,尽可能采用模块方式,只针对性引进所须要的类。

三、尽可能使用const、enum来替换预处理#define框架

  • 尽可能避免使用#define预处理命令。#define预处理命令不包含任何的类型信息,仅仅是在编译前作替换操做。它们在重复定义时不会发出警告,容易在整个程序中产生不一致的值。
  • 在源文件(.m)中定义的static const类型常量由于无须全局引用,因此它们的名字不须要包含命名空间。
  • 在头文件(.h)中定义的全局引用的常量,须要关联定义在源文件(.m)中的部分。由于须要被所有引用,因此它们的名字须要包含命名空间,一般是用他们的类名做为命名前缀。
  • 尽可能用NS_ENUM和NS_OPTIONS宏来实现枚举。

四、优先使用对象字面量语法而非等效方法函数

  • 尽可能使用对象字面量语法来建立字符串、数字、数组和字典,比常规对象建立方法语法更为简明
  • 彻底向下兼容
  • 在数字和字典中,要使用关键字和索引作下标来获取数据
  • 使用对象字面量语法时,容器类的不可以使nil,不然运行时将会抛出异常。

五、处理隐藏的返回类型,优先选择实例类型(instancetype)而非id编码

  • instancetype仅用于返回类型
  • 使用instancetype可避免隐式转换id而形成的欺骗性编译无误经过的现象,防止程序正式运行时出现崩溃现象,提升安全性
  • 在某一个特定区域,能够替代id,并不是全部区域均可以替代id

六、尽可能使用模块方法与多类创建复合关系设计

  • #include和#import,其根本就是简单的复制、粘贴,将目标.h文件中内容一字不落的复制到当前文件中,后者能够避免屡次的重复引用
  • 以预编译头文件的方式,虽可缩短编译时间,但其维护棘手,不利于普遍应用。
  • 模块功能,其应用不只仅表现于编译的速度加快,同时在链接框架等方面也很是好用
  • 启动模块功能后,编译器会隐式地把全部的#import都转换成@import

七、明解Objective-C++中的有所为而有所不为对象

  • C++和Objective-C在定义结构上同样,可是后者的继承是封闭的
  • Objective-C接口中定义的C++类是全局范围,而不是Objective-C类的内嵌类
  • C++和Objective-C的对象模型不能直接兼容,与Objective-C不一样的是,C++对象是静态类型的,有运行时系统多态是特殊状况
  • C++和Objective-C有词汇歧义和冲突
  • C++和Objective-C二者功能上有限,Objective C++没有为Objective-C类增长C++的功能,也没有为C++类增长Objective-C的功能
相关文章
相关标签/搜索