iOS初学之OC程序员iOS 开发

阅读Effective Object-C 2.0 笔记(三)

2016-04-14  本文已影响49人  iLeooooo

还是要好好学习英文啊,笔者只能看中文版的,下载地址如下:
http://download.csdn.net/detail/m6830098/7977521
看书的时候还是困的不行不行的,今天不看书都困-

今天来学习学习本书的第三章。

第一条:用前缀避免命名空间冲突。避免命名冲突的办法就是变相实现命名空间:为所有名称都加上适当的前缀。要点:1.选择与你的公司、应用程序或者二者皆有关联的名称作为类名的前缀,并在所以的代码中均使用这一前缀。2.若自己开发的程序库中用到了第三方库,则应为其中的名称加上前缀。

第二条:提供"全能初始化方法"。所有对象均要初始化,如果创建类实例的方式不止一种,那么该类就会有多个初始化方法。这当然很好,不过仍要在其中选定一个作为全能初始化方法,让其他的初始化方法都来调用它。于是,只有在全能初始化方法中,才会存储内部数据,这样当底层数据存储机制改变时,只需修改此方法的代码就OK了,其他的方法无需改动。如果子类的全能初始化方法与超类的方法名称不同,那么总应覆写超类的全能初始化方法。每个子类的全能初始化方法都应该调用其超类的对应的方法,并逐层向上。要点:1.在类中提供一个全能初始化方法,并注释指明,其他的初始化方法均应调用此方法。

第三条:实现description方法。在自己的类里面覆写description方法,打印出更多有用的信息。

- (NSString *)description {
    return [NSStringstringWithFormat:@"<%@:  %P, \"%@  %@\">", [self class], self, _firstName, _lastName];
}

NSObject协议中还有个方法要注意,那就是debugDescription,此方法的用意与description类似,区别:debugDescription是开发者在调试器(debugger)中以控制台命令打印对象时才调用的。 打断点处:在控制台中的"po"命令可以完成对象打印。

- (NSString *)debugDescription {
    return [NSStringstringWithFormat:@"<%@:  %P, \"%@  %@\">", [self class], self, _firstName, _lastName];
}

第四条:1.尽量创建不可变的对象。 2.若某属性仅可于对象内部修改,则在"class-continuation分类"中将其由readonly属性扩展为readwrite属性。 3.不要把可变的collection作为属性公开,而应提供相关的方法,以此修改对象中的可变collection。

第五条:使用清晰而协调的命名方式。方法与变量名使用了"驼峰式大小写命名法",以小字母开头,其后每个单词首字母大写。类名也用驼峰命名法,不过其首字母要大写,而且前面通常还有两三个前缀字母。给方法命名时的注意事项可以总结以下几条规则:

1.如果方法的返回值是新创建的,那么方法名的首个词应该是返回值的类型,除非前面还有修饰语。

2.应该把表示参数类型的名词放在参数前面。

3.如果方法要在当前对象上执行操作,那么久应该包含动词;若执行操作时还需要参数,则应该在动词后面加上一个或多个名词。

4.Boolean属性应加is前缀,如果某个方法返回非属性的Boolean值,那么应该根据其功能,选用has或is当前缀。

5.将get这个前缀留给那些借由"输出参数"来保存返回值的方法。

6.给私有方法的名称加上前缀,这样可以很容易的将其同公共方法区分开。

7.不要单用一个下划线做私有方法的前缀,这个是苹果公司用的,系统自带。

第六条:理解Object-C的错误类型。NSError对象里封装了三条信息:1.Error domain(错误范围,其类型为字符串):错误发生的范围,既产生错误的根源,通常用一个特有的全局变量来定义。2.Error code(错误码,其类型为整数):独有的错误代码,用以指明在某个范围内的具体发生了何种错误。3.User info(用户信息,其类型为字典):有关此错误的额外信息。

第七条:理解"NSCopying"协议。使用对象时经常需要拷贝他,在Object-C中,此操作通过copy方法完成。如果想令自己的类支持拷贝操作,那么就要实现NSCopying协议,该协议只有一个方法:

- (id)copyWithZone:(NSZone *)zone;

在h文件中支持NSCopying协议。<NSCopying>,然后实现协议中的规定:

- (id)copyWithZone:(NSZone *)zone {
    WWPerson *copy = [[[self class] allocWithZone:zone] initWithFirstName:_firstName andLastName:_lastName];
    return copy;
}

带参数的copy协议:
- (id)copyWithZone:(NSZone *)zone {
WWPerson *copy = [[[self class] allocWithZone:zone] initWithFirstName:_firstName andLastName:_lastName];
copy->friends = [_friends mutableCopy];
return copy;
}

NSMutableCopying协议:

- (id)mutableCopyWithZone:(NSZone *)zone;

对于不可变的NSArray和可变的NSMutableArray来说,下列关系总是成立的:

-[NSMutableArray copy] => NSArray
-[NSArray mutableCopy] => NSMutableArray

在编写拷贝方法时,还要决定一个问题,就是应该执行"深拷贝(deep copy)"还是"浅拷贝(shallow copy)",深拷贝:在拷贝对象自身时,将其底层数据也一并复制过去。Foundation框架中的所有collection类在默认情况都执行浅拷贝,也就是说只拷贝容器对象本身,二不复制其中的数据。这样做的主要原因在于,容器内的对象未必都能拷贝。


深拷贝与浅拷贝区别.png

要点:如果自定义的对象分为可变版本和不可变版本,那么就要同时实现NSCopying和NSMutableCopying协议。复制对象时需决定采用浅拷贝还是深拷贝,一般情况应尽量执行浅拷贝。

最后,本书一共7个章节,此为第三章节:接口与API设计。

共勉!一步一个巴掌印。。。。。

上一篇下一篇

猜你喜欢

热点阅读