《Effective obj-c 2.0》笔记

语法糖创建的对象,是不可变的,若想要可变对象,需要调用mutableCopy


@class

应该将引入头文件的时间尽量延后,只在的确需要时才引入,这样就可以减少类的使用者所需引入的头文件数量。如果把头文件写在.h中,那么就会造成直接引入头文件所有内容。此过程若持续下去,则要引入许多根不用不到的内容,这会增加编译时间。

减少#define的使用

在开发的过程中,我们会使用#define定义一些长宽或者动画时间等可能需要不断修改
的数值,这些都是没有类型的值。

例如:

#define ANIMATION_DURATION 0.3 `</pre>
这样的写法,有可能会造成其他地方相同命名的宏定义被修改,为此,我们应该采取更为安全的方式来解决问题。
<pre>`static const NSTimeInterval xxxxxxxxxx = 0.3; 

这样做的好处在于,变量被static和const声明后,如果试图修改由const修饰符所声明的变量,那么编译器就会报错。

方法调用

我们在使用中括号调用一个方法时候,编译器都会将其转换为一条标准的C语言函数objc_msgSend调用,它会在接受者所属的类中搜寻相同名称的方法,若是找到,便执行相应代码。如果没有找到,它就会沿着继承体系继续向上查找,等找到合适的方法在进行跳转。

为了解决步骤过多的问题,objc_msgSend会将结果缓存起来,稍后若是继续调用,可更快速的执行相应代码。

接口的设计

有时我们可能设计一些接口给他人使用,声明的每一个属性都需要保证其初始化,确保这个类按照我们想象中的样子进行,为了保证每个属性都被初始化,我们需要一个很“全能”的初始化方法。

我们可以将一定要初始化的属性声明为只读,接着提供一个新的接口,让其他人必须通过这个接口,传入所需的所有参数,确保类的正常工作。

在适当的地方覆写description方法

在一些地方,我们需要了解Model层中,各项属性的具体值是多少,如果使用NSLog直接打印,只会出现内存地址。

在覆写description方法后,我们可以随意打印我们需要展示的信息,便于开发和调试。