effective objective-c 2.0 笔记 第三章 :接口与API设计

目录结构:

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

2.提供全能初始化方法

3.实现description方法

4.尽量使用不可变对象

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

6.为私有方法名加前缀

7.理解objective-c错误模型

8.理解nscopying协议


选择公司,应用程序或者两者有关联的名字作为类名的前缀,若自己所开发的程序库用到了第三方库,则应为其中的名称加上前缀。

尽量创建不可变对象,若属性对象仅可用于内部修改,则在class-continuation分类中将readonly属性修改为readwrite属性。

不要把可变的collection作为属性公开,应提供相关方法修改可变的collection.

命名方式一般采用驼峰式。

比较下面两种命名方式:

方式一

-(void)initWithSize:(float)width:(float)height;

[[A alloc] initWithSize:5.0f :10.0f];

方式二

-(void)initWithWidth:(float)width andHeight:(float)height;

[[A alloc] initWithWidth:5.0f andHeight:10.0f];

方式二方法名长一些,但是可读性更强。

命名应协调一致,如继承自UIView类名应该以View结尾,定义委托接口应该以Delegate结尾等。

私有方法名最好加上前缀跟公有方法名区别开来,通常加上p_作为前缀。


自动引用计数默认情况不实异常安全的。抛出异常会造成本应在作用域末尾释放的对象不会自动释放。

要做到异常安全,需要添加-fobjc-arc-exceptions

objective-c通常只在极其罕见的情况下抛出异常,表示发生了极其严重的错误,无须考虑恢复问题。

一般错误通常返回nil或者用NSError来处理。NSError包括错误范围,错误码,用户信息。


对象要支持拷贝操作需要实现NSCopying协议,协议只有一个方法:

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

程序把内存分为不同的区,对每个程序而言,只有一个默认的区(default zone);

实现范例:

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

A *copy = [[[self class] copyWithZone:zone] initWithFirstName:_firstName

              andLastName:_lastName];

        return copy;

}

-(id)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName{

if(self = [super init]){

_firstName = [firstName copy];

                _lastName = [lastName copy];

                _friends = [NSMutableSet new];

}

        return self;

}


对与可变对象的拷贝,需要支持NSMutableCopying协议。实现方法-(id)mutableCopyWithZone:(NSZone *)zone;

一般情况下自定义类会以浅拷贝的方式实现copyWithZone方法。


你可能感兴趣的:(iOS开发)