Objective-C 起源
Objective-C语言是有 Smalltalk 演化而来,使用消息结构
而非函数调用
。
消息结构和函数调用的区别:
1.使用消息结构的语言,运行时所执行的代码由运行环境决定。
2.使用函数调用的语言,由编译器决定。
函数调用的语言,如果某个函数是多态的,只在运行时会根据“虚函数表”查找到对应的具体要执行的函数。
而消息结构的语言,所有的方法都是在运行时去查找所要执行的方法。
这就是为什么 runtime 那么强大的原因,可以在运行时去改变原始代码的执行逻辑。
要点:
Objective-C 使用动态绑定的消息结构,在运行时才会检查对象类型。接受一条消息之后,究竟应执行何种代码,由运行环境决定而非编译器决定。
在类的头文件中尽可能少引入其他头文件
前向声明: @class EOCEmployer
前向声明只是告诉有个这个类,但是具体的属性,方法不知道。
好处:
1.避免类之间相互引用,降低类之间的耦合度
2.缩短编译时间
如果两个类相互引用,虽然#import 不会引起死循环,但是其中一个类无法正确编译。
多用字面量语法,少用与之等价的方法(语法糖)
应该使用字面量语法来创建字符串,数值,数组,字典。与创建此类对象的常规方法相比,这么做更加简明扼要。
应该通过取下标操作来访问数组下标或字典中的键所对应的元素
用字面量语法创建数组或字典时,若值中有nil,会抛出异常。因此,务必保证值不为 nil。
NSNumber *number = @1;
NSString * string = @"string";
NSArray * array = @[@1,@2,@3];
NSDictionary * dictionary = @{@"name":@"wangbo",@"qq":@"91224867"};
array[1];
dictionary[@"name"];
多用常量类型,少用#define 预处理指令。
不要使用预处理指令定义常量,这样定义出来的常量不包含类型信息,编译器只是在编译前执行查找并替换。
在实现文件中使用 static const 来定义“只在编译单元内可见的常量”。由于此类常量不在全局符号表中,所以无须为其名称加类前缀,一般加 k
在头文件中使用 extern来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以一般用类前缀加一个区分。
// 在实现文件中
static const NSTimeInterval kAnimationDuration = 0.3;
// 在头文件中
extern NSString * const NIPLoginManagerDidLoginNotification;
// 在实现文件中
NSString *const NIPLoginManagerDidLoginNotification = @"VALUE";