现在正式谈谈代码规范了,代码规范是一个很大的课题,由于我本人能力的局限,不能很详细生动专业的在宏观上去讲代码怎么写才是规范的,所以就化整为零的去写写代码哪些地方应该注意的问题吧。
首先就从宏开始,一般我们写一个项目都会用到宏去定义一个字符串、int常量等,例如#define ANIMATION_DURATION 0.3 这个预处理指令会把代码中的ANIMATION_DURATION替换成0.3,一般这样写确实也达到了我们预计的目的,不过这样写有几个问题:1.这个常量没有类型信息,光从代码字面上只可以看出和动画时间有关。 2.预处理过程中会把碰到的所有 ANIMATION_DURATION 一律替换成0.3,这样的话假如这个宏定义在了一个类的.h文件中,那么在其他导入了这个.h文件的类文件中,所有的 ANIMATION_DURATION都会被替换;3.使用宏定义的常量可能会无意中遭人修改,从而导致应用程序中各个部分所使用的值互不相同。在Xcode6之前,当我们创建一个工程文件时,都会默认创建一个pch文件,但之后就不会默认创建了,以及后来苹果提到在写项目时建议少用宏可以看出宏会影响项目的性能。那么怎么写才更好呢?可以使用下面这个方法:
static const NSTimeInterval kAnimationDuratin = 0.3;
用这种方式定义的常量既包含了类型信息,也不会额外耗费预处理的资源。这里需要注意一下命名规范:若常量局限与某“编译单元”(即实现文件.m)之内,则在前面加字母k;若常量在类之外可见,通常以类名为前缀。另外定义常量的位置也很重要,一般在头文件中定义宏常量或者static const 定义的常量非常不可取,因为当在别的文件中导入这个头文件时,有可能会引起命名冲突,所以这儿又回到了前面提到的常量在类之外时命名应以类名为前缀的问题了。变量一定要同时使用static const 修饰符来声明,如果试图修改const修饰符所声明的变量,那么编译器就会报错,而static则表明此变量仅在定义此变量的编译单元中可见。有时候需要对外公开某个常量,例如通知名称,常见的系统键盘事件通知名称,并不是一个具体的字符串,因为注册者无须知道实际字符串值,所以只需以常量变值来注册自己想要接收的通知即可。这个常量在头文件中“声明”,且在实现文件中“定义”。例如这样:
.h | extern NSString *const ConstString;
.m | NSString *const ConstString = @"a string";
这里extern表示声明一个全局变量,也可修饰函数。
好了,上面分析了代码中宏的不足之处,并给出了有效的定义常量的方法去替代宏常量。看完这篇文章,你是否对宏有一个新的理解呢?如果此文章对你有所启发,请给个赞哈❤️