目录结构:
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方法。