第一条:了解Objective-C的语言起源
消息结构和函数调用的区别:使用消息结构的语言,其运行时所执行的代码由运行环境来决定;使用函数调用的语言,则由编译器决定。如果范例代码中调用的函数是多态的,那么在运行时就要按照“虚函数表”来查出到底应该执行那个函数实现。而采用消息结构的语言,不论是否多态,总是在运行时才会查找所要执行的方法。实际上,编译器甚至不关心接收消息的对象是何种类型。接收消息的对象问题也要在运行时处理,其过程叫做“动态绑定”。
Objective-C的重要工作都由“运行期组件”而非编译器来完成。使用Objective-C的面向对象特性所需的全部数据结构及函数都在运行期组件里面。
第二条:在类的头文件中尽量少引入其他头文件
除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用前项声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类的耦合。
有时无法使用前项声明,比如要声明某个类遵循一项协议。这种情况下,尽量把“该类遵循某项协议”的这条声明移至“class-continuation 分类”中。如果不行的话,就把协议单独放在一个头文件中。然后将其引入。
第三条:多用字面量语法,少用与之等价的方法
NSString *something = @"xxxx";
如果不使用这种语法的话,就要以常见的alloc init的方法来创建并分配初始化NSString对象。
字面数值:
NSNumber *someNumber = @1;
字面数组:
一般这样来创建数组:
NSArray *animals = [NSArray arrayWithObjects:@"cat", @"dog", @"mouse", @"badger", nil];
使用字面量语法来创建则是:
NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"];
字面量字典
NSDictionary *personData = [NSDictionary dictionaryWithObjectsAndKeys:
@"Matt", @"firstName",
@"Galloway", @"lastName",
[NSNumber numberWithInt28], @"age", nil];
字面语法:
NSDictionary *personData = @{@"firstName" : @"Matt",
@"lastName" : @"Galloway",
@"age": @28};
按照特定键访问其值的传统做法是:
NSString *lastName = [personData objectForKey@"lastName"];
与之等效的字面量语法则是:
NSString *lastName = personData[@"lastName"]
要点:
1)应该使用字面量语法来创建字符串,数值,数组,字典
2)应该通过取下标操作来访问数组下标或字典中的键所对应的元素
3)用字面量语法创建数组或字典时,若值中有nil, 则会抛出异常。因此,务必确保值里不含nil.