1.多用字面量语法,可读性较强
2.尽量使用“向前申明”,而不是直接在头文件中导入。
3.尽量少用预处理指令来定义变量,换做类型常量static const/ extern NSString * const str来替代;
4.尽量使用枚举来定义状态,选项,状态码。可读性更强
5.理解NS_Enum和NS_Options来定义枚举的差异,进不进行位运算,2的幂次方
6.用switch处理枚举类型的值时,尽量不要实现default分支,这样的话加入新的枚举之后,编译器就会提示开发者,switch语句并没处理所有的枚举
7.理解对象和消息传递
8.理解属性,关键字:@synthesize name = _name; @dynamic name;
9.理解属性特质分为四种类型:1.原子性 (atomic,nonatomic)2.读写权限(readonly,readwrite)3.内存管理(assign,weak,strong,copy,unsafe_unretained)4.方法名(getter,setter)
1>>.原子性:atomic存取方法中添加同步锁,增加性能损耗,macOS环境下没有此风险;nonatomic常与@synchronized来搭配使用起到同步锁的作用.
2>>.读写权限:
assign:常用来修饰非OC对象的基本数据类型,如果用来修改OC对象,效果类似于weak不能增加引用计数,但是有点不一样的是当被指向对象被释放时,assign修改的只指针对象不会被释放,会实诚“野指针”,会产生EXC_BAD_指针错误。
weak:常用来修改OC对象,不会增加引用技术,和strong相对应。当指向地址被释放时,指针自动被释放。
strong:增加引用计数.设置方法先会保留新值,并释放旧值,然后再将新值设置上去。
copy:将新值进行一份拷贝,常用来保护不想被修改的数据的类型。
unsafe_unretain:特质与assign很相似,适用于OC对象类型,目标对象销毁时,也不会被释放。
3>>.getter=<name>
@property(nonatomic,getter=isOn)BOOL on;
10.在对象内部尽量直接使用实例变量来访问,而写入数据时最好采用“点语法”访问,其中涉及到“方法派发”,“键值观测”
-setName:(NSString *)name{
self.name = name;
}
- (NNString *)name{
return _name;
}
11.在初始化方法以及dealloc方法中,总是应该访问实例变量来读取数据。
12.在使用了“惰性初始化”(懒加载)技术时,必须使用属性的来读取数据。不然会导致没法初始化。
- (EOCBrain *)brain{
if(_brain){
_brain = [EOCBrain new];
}
return _brain;
}
13.理解“对象等同性”,理解“==”和“isEqual”的区别。
//验证“==”与“isEqual”的区别
NSString *str1 = @"lenka";
NSString *str2 = [NSString stringWithFormat:@"lenka"];
NSString *str3 = @"1";
NSNumber *number = @1;
NSLog(@"%d",str1 == str2);// false
NSLog(@"%d",[str1 isEqual:str2]); //true
NSLog(@"%d",[str1 isEqualToString:str2]);//true
NSLog(@"%d",[str3 isEqual:number]);//false
究其原因:“==”操作符比较的是指针地址是否相同,而“isEqual”比较的是对象的数据类型和值是否相同,当确定是NSString类型的数据进行比较时,采用“isEqualToString”的比较速度较快。
14.
a.若想检测对象的等同性,请提供“isEqual”和hash方法。
b.相同的对象一定具有相同的哈希码,但是具有相同哈希码的对象不一定相同。
c.不要盲目地逐条检测每个属性,而是应该依照具体需求来制定检测方案.
d.编写hash方法时,应该使用计算速度快且哈希码碰撞几率低(碰撞指的是可能相同)的算法。
15."方法调配"
Method originMehtod = class_getInstanceMethod([NSString class],@selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class],@@selector(uppercaseString));
method_exchangedImplemetation(originMehtod,swappedMethod);
16.每个实例都有一个指向Class对象的指针isa,用以表明其类型,而这些Class对象构成了类的继承体系;如果对象类型在编译期间无法确认,那么应该使用类型信息查询方法来探知(isKindOf,isMemberOf);尽量使用类型信息查询方法来确定对象的类型,而不要直接比较(==)类对象。因为某些对象可能实现了消息转发功能。
API与接口设计
1.使用前缀避免命名空间冲突,apple保留“两字母前缀”的使用权利。
前缀的命名规则:项目名称简写,公司名称等。