第15条 用前缀避免命名空间冲突
苹果宣布保留两字母前缀的权利,所以最好用三个字母的前缀,以防止以后苹果更新的时候与其冲突。
纯 C 语言的函数,如果没有 static 修饰,最好加前缀,因为如果在别的文件里也定义了相同名称的函数就冲突了。
如果你写了一个第三方库想给别人用,若代码里用了个别的第三方库,最好修改其前缀,因为别人的项目里也可能用了你引用的那个第三方库。
第16条 提供全能初始化方法
所谓全能初始化方法,如你定义的类里有很多条初始化方法,但是所有的初始化方法都会调用同一个方法,这个方法就是全能初始化方法。
如果你自定义了很多初始化方法,不希望别人调用init
,可以重写init
,然后在里面抛出异常。或者在里面给参数赋上默认的值。
第17条 实现description方法
一个通用规范:
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@, %p, %@>", [self class], self, @{@"name":_name, @"age":@(_age)}];
}
//打印结果:
result = <MyClass, 0x608000027b60, {
age = 18;
name = "Tom";
}>
打断点后可以在控制台用 po
命令输出属性信息,属性的信息是由 - (NSString *)debugDescription
函数定义的。
- (NSString *)debugDescription
{
return [NSString stringWithFormat:@"%@", _name];
}
第18条 尽量使用不可变对象
开发中,如果属性对外公布,尽量做成read-only,即只能读,不能写。
第19条 要使用清晰而协调的命名方式
第20条 为私有方法名加前缀
方法名不要以下划线开头,因为有可能跟苹果的私有方法重名。
私有方法可以用p_
开头,比如:
- (void)p_resetTheLists;
第21条 理解oc错误模型
第22条 理解NSCopying协议
自定义对象遵循该协议,要实现- (id)copyWithZone:(NSZone *)zone
方法。如果有些不是属性,而是实例变量,可以用->
。
@interface Student()
{
NSMutableArray *_friends;
}
@propery(strong) NSString *name;
@propery(assign) int age;
@end
- (id)copyWithZone:(NSZone *)zone
{
Student *s = [[Student allocWithZone:zone] init];
if (s) {
s.name = _name;
s.age = _age;
s->_friends = [_friends mutableCopy];
}
}
此例子中,若 _friends
为不可变对象,则无需复制,因为本身就是不可变的,不用担心被修改,即跟原来的对象共用一块内存。
//下面的方法可以直接深复制一个数组,后面参数表示是否复制数组里的元素
NSMutableArray *arr2 = [[NSMutableArray alloc] initWithArray:arr1 copyItems:YES];