Effective Objective-C 2.0读书笔记(一)

熟悉Objective-C#

第一条:Objective-C的起源

OC使用”消息结构”而非”函数调用”,Objective-C语言由Smalltalk衍变而来,音讯与函数调用之间的分别看上去似乎这么:

//消息结构(Objective-C)
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter1];

//函数调用(C++)
Object *obj = new Object;
obj->perform(parameter1,parameter2);

要害分歧在于:使用音信结构的言语,其运维时所应执行的代码由运转条件来决定;而利用函数调用的言语,则由编译器决定。

要点

  • Objective-C为C语言的添加了面向对象个性,是其最佳。Objective—C使用动态绑定的音讯结构,也等于说,在运营时才会检核对象类型。接收一条新闻之后,终归应实施何种代码,由运行环境而非编译器来支配。
  • 知道C语言的着力概念有助于写好Objective-C程序。尤其要明白内存模型和指针。

第一条:在类的头文件中尽量少引入其余头文件

你可能成立了名为EOCPerson和EOCEMPloyer那多少个类,想让每一种EOCPerson实例都有贰个EOCEMPloyer常见的法子是在EOCPerson.h中投入下边那行:

#import "EOCEMPloyer.h"

那种办法有效,可是不够优雅。在编译二个行使了EOCPerson类的文书时,不须要精晓EOCEmplyer类的全套细节,只需要了然有1个类名为EOCEmplyer就好。所幸有个方法能把这一景况告知编译器:

@class EOCEmployer;

那称为”向前注脚”该类。而EOCPerson类的贯彻公文则需引入EOCEployer类的头文件,因为若要使用后者,则必须精通其颇具接口细节。
将引入头文件的机会尽量延后,只有确有要求时才引入,那样就足以削减类的使用者所需引入的头文件数量。假若本例把EOCEmployer.h引入到EOCPerson.h,那么只要引入EOCPerson.h,就会一并引入EOCEployer.h的有着情节。此过程若持续下去,则要引入许多有史以来用不到的始末,那本来会大增编制时间。向前声明也解决了多少个类相互引用的标题。

纵然要申明你写的类遵守某些协议(protocol),那么该协议必须有整机定义,且不能拔取向前注解。向前声明只好告诉编译器有有个别协议,而那时编译器却要领会该协议中定义的点子。此时在.h中#import是难免的。鉴于此,最好把协议单独放在一个头文件中。假若把共商放在有些大的头文件中,那么只要引入此协议,就必定会引入那些头文件中的全体内容,就会发出互相倚重的题材,而且还会增多编译时间。

不过有个别协议,比如代理协议,就不要单独写三个头文件了。在那种情景下协议唯有与接受协议委托的类位居一块儿定义才有意义。

要点

  • 只有确有必要,否则不要引入头文件。一般的话,应该在某些类的头文件中行使向前表明来提及其余类,并在得以已毕文件中引入那3个类的头文件。那样做可以尽大概降低类之间的耦合。
  • 有时无法运用向前评释,比如声明有些类听从某项协议。应竭尽把“该类听从某商谈”的那条注解移至”class-continuation
    分类”中。假如这三个的话,就把协议放到一个头文件中,然后将其引入。

其三条:多用字面量语法,少用与之等价的措施

采取字面量语法可以减掉代码长度,使其更为易读。例如:

NSNumber *intNumber = @1;
NSArray *animals = @[@"cat",@"dog",@"mouse",@"badger"];
NSDictionary *personData = @{@"firstName":@"Matt",@"lastName":@"Galloway"};

数组取有个别下标所对应的靶子,例如:

NSString *dog = animals[1];

字典根据特定键访问其值,例如:

NSString *lastName = personData[@"lastName"];

修改可变数组与字典内容的正规化做法是:

mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Galloway";

可是,用字面量语法创设数组时要留心,若数组成分对象中有nil,则会抛出格外,抛出的百般会是这么:

***Terminating app due to uncaught exception
'NSInvalidArgumentException,'reason:'***
- [__NSPlaceholderArray initWithObjects:count:]: attempt to
insert nil object from objects[0]'

用数组一样,用字面量语法创设字典时也有其一题材,那就是如若有值为nil,便会抛出非凡。但那也是个好事。例如创设字典时不小心用了空值对象,那么“dictionaryWithObjectAndKeys:”方法就会在首个nil从前停下,并抛出分外,那样有助于差错。

要点

  • 相应运用字面量语法来成立字符串,数值,数组,字典。与符合规律办法相比较,那样做越来越从简。
  • 有道是经过去下标操作来访问数组下标或字典中的键所对应的因素。
  • 用字面量语法创造数组或字典时,若值中有nil,则会抛出相当。由此,务必确保值里不含nil。