OC的起源
OC为C添加了面向对象的特性。OC是用的是动态绑定的消息结构,不像是C的函数调用,所以在编译的时候不会在乎对象的类型,只有在运行时才会检查对象类型。
在接受一条消息之后,究竟应该执行什么代码,是由运行时环境决定的而不是编译器来决定。
关于引入头文件
除非有必要,否则不要引入头文件。一般来说,应该在h文件里面使用向前声明:@class,来提及别的类,然后在实现文件里面再引入那些类的头文件。
有时无法使用向前声明,比如遵循某个协议,需要引入头文件,尽量放在实现文件里面去遵循,实在不行,就将协议单独放在一个h文件里面,然后单独将其引入。
尽量使用字面量
尽量使用字面量来创建对象。字面也支持数据运算。例如:
CGFloat x = 1.1;
CGFloat y = 2.2;
NSNumber *z = @(x + y);
在字面量数组上,
NSArray *a = [NSArray arrayWithObjects:x,y,z,nil];
NSArray *b = @[x, y, z];
使用第一种去创建,如果x和z都指向了有效的对象,但是y是nil,那么在执行完之后不会崩溃,但是数组a只有一个x对象,因为arrayWithObjects方法会依次处理各个参数,直到发现nil,终止处理。 但是如果用字面量,会直接崩溃。
这种特性同样适用于字典的 dictionaryWithObjectsAndKeys
尽量多用类型常量,少用#define预处理命令
static、extern、const
static 和 extern 用来设置变量的作用域。
const:设置变量只能是可读,不可以被修改。
static: 用static修饰的变量,在它所修饰的作用域里面只会有一份内存,在作用域中修改每次都会从上次修改的基础上进行修改。
static修饰的变量算作静态全局变量,在作用域中可以算是全局变量,对作用域外没有任何影响,在作用域外可以定义一个相同名字的变量。
但是如果是在appdelegate或者别的单例中定义的非静态全局变量,名字必须是唯一的。
extern:用extern修饰的变量,凡是引用了这个变量所在的头文件,都可以使用这个变量。
一般的用法是定义一个h文件,添加几个变量,不进行初始化,然后在需要用到的地方去初始化使用,算作全局变量的一种用法。
混搭使用:
static NSString *const indentifier = @"hello";
static和const 使用,相当于本文件中的一个宏定义,不可以在外部使用。
extern和const一块使用,一般是在h文件中:
extern NSString *const hello;
在m文件中
NSString *const hello = @"world";
这样可以在外部文件中调用,且不需要知道内部的value值,只需要知道key值。一般用于通知。
枚举
多使用枚举来表示各种状态、传递给方法的选项以及状态码等值。给一个通俗易懂的名字。
如果把传递给某个方法的选项作为枚举类型,而多个选项又可同时使用,那么就可以将各选项的值定义为2的幂,以便通过按位或操作将其组合起来。
在处理枚举类型的switch中不要实现default分支,这样的话当增加了新的枚举类型,编译器就会提醒。但是如果加了default就不会提醒。
网友评论