Effective Objective -C 第三章 接口与API设计 - 读书笔记

15.用前缀避免命名空间冲突

  • 用自己的符号为类名加一个属于自己的前缀,避免与原生类,或者第三方引入的类名造成冲突
  • 若自己所开大的程序库中用到了第三方库,则应为其中的名称加上前缀。

16. 提供“全能初始化方法”

  在编程中如果不想让继承某类的子类调用父类的某个方法,可以在重写父类某个方法的时候抛出异常:

- (id)init{
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Must user initWithDimension: insteads" userInfo:nil];  
}
  • 在类中提供一个全能初始化方法,并于文档指明。其他初始化方法均应该调用次放啊。
  • 若全能初始化方法与超类不同,则需要覆写超类中对应的方法。
  • 如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常。

17.实现description方法

  • 实现description方法返回一个有意义的字符串,用以描述该实例变量。
  • debugDescription 方法是开发者在调试器中意控制台命令打印对象时才调用的。
- (NSString *)description{
  return [NSString stringWith Format:@"%@ %@,_name,_age"];  
}
- (NSString *)debugDescription{
   return [NSString StrinfWithFormat:@"<%@ : %p,\" %@ %@ \">",[self class], self, _name, _age];  
}

例如 在自主创建的类中重写debugDescription方法,当插入断点,然后通过调试器运行程序,使之暂停于此。在控制台LLDB的“po” 命令就可以完成打印。

 18.尽量使用不可变对象

  • 在编程实践中,则应该尽量把对外公布出来的属性设为只读,而且只在确有必要时才将属性对外公布。
  • 不要在返回的对象上查询类型以确定其是否可变。
  • 开发者或许不宜从底层直接修改对象中的数据。
  • 若某属性仅可于对象内部修改,则在“class-continuation分类”中将其由readonly属性扩展为readwrite属性。
  • 不要把可变的collection作为属性公开,而应提供相关方法,以此修改对象中的可变collection。

19.使用清晰而协调的命名方式

给方法命名时的注意事项:

  • 如果方法的返回值时新创建的,那么方法名的首个词应时返回值的类型,除非前面还有修饰语。
  • 应该把表示参数类型的名词放在参数前面。
  • 如归方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需要参数,则应该在动词后面加上一个或多个名词。
  • 不要使用想str这中简称。
  • BOOL属性应家is前缀,如果某方法返回非属性的Boolean值,那么应该根据其功能,选用has或is当前缀。
  • 将个体这个前缀留给那些借由“输出参数”来保存返回值的方法,比如说,把返回值填充到“C语言式数组”里的那种方法就可以使用这个词做前缀。

类与协议的命名:

20.为私有方法名加前缀

为私有方法名加前缀,其中最好包含下划线与字母p。

例如:

-  (void)p_privateMethod{};

21.理解OC错误模型

NSError 对象里封装的三条信息:

  Error domain(错误范围,其类型为字符串);

  Error code (错误码。其类型为整数);

  User Info(用户信息,其类型为字典)。

  • 只有发生了可使整个应用程序崩溃的严重错误时,才应使用异常。
  • 在错误不那么严重的情况下,可以指派“委托方法”来处理错误,也可以把错误信息放在NSError对象里,经由“输出参数”返回给调用者。

22.理解NSCopying协议

- (id)copyWithZone:(NSZone *)zone;(该方法一般都是浅拷贝)

  • 在可变对象上调用copy返回另外一个不可变类的实例。
  • 深拷贝:在拷贝对象自身时,将其底层数据也一并复制过去。
  • 在Foundation框架中的所有collection类在默认情况下都执行浅拷贝,也就是说,只拷贝容器对象本身,而不复制其中数据。
  • 若想令自己所写的对象具有拷贝功能,则需实现NSCopying协议。
  • 如果自定义的对象分为可变版本与不可变版本,那么就要同时实现NSCopying与NSMutableCopying协议。
  • 复制对象时需要决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝。
  • 如果你所写的对象需要深拷贝,那么可以考虑新增一个专门执行深拷贝的方法。

 

posted on 2017-03-27 16:43  黄小逗  阅读(115)  评论(0)    收藏  举报

导航