第一章 熟悉Objective-C
1.了解起源
oc 使用“消息结构”,运行时执行的代码由运行环境决定,而函数调用的语言,由编译器决定。
在oc,有部分变量不算oc对象,如CGRect.
2.在类的头文件中尽量少引入其他头文件
将引入头文件的时间尽量延后,可以减少类的使用者所需引入的头文件的数量。
一般的做法是:
#Person.h
@class A
#Person.m
#import A
但是如果你的类继承自某个类,或者有代理方法,就必须放在.h
3.多使用字面量语法
这个语法方便好用,但是我还是有点不习惯。一般数组,字典的我用它。
如 NsArray *animals = @[@"cat",@"dog"];常规写法我就不写了。
取数组下标: NSString *dog = animals[1];
NSDictionNary *dic = @{@"dog":@"first",@"cat":@"second"};
NSString *dog = dic[@"first"];
局限性:字面量的元素不能为nil,而且除了字符串以为必须为Foudation对象。并且都是不可变的 ,如需可变 后面需要加 mutableCopy.
4.多用类型常量,少用#define
预处理不含类型信息,在.m中加入static const,定义只在编译单元可见。
5.用枚举表示状态,选项
第二章:对象,消息,运行期
6.理解属性
nonatmic,atomic,非原子性。表示线程不安全。atomic有锁机制。但是耗费性能。所以,ios中还是用nonatmic
assign,weak 区别:assign修饰常量。weak 会 set nil.
strong,copy.一般字符串用copy.
其他的我就不说了。
7.对象内部尽量直接访问实例变量
10.关联属性
12.理解消息转发机制
消息转发分为2个阶段:1.征询接受者,所属的类看其是否能够动态添加方法,以处理当前这个@selector,这叫做动态方法解析,2.看看有没有其他对象能处理这条消息,若有,则运行期系统会把消息转给那个对象,于是消息转发过程结束。否则,启动完整的转发机制,运行期系统会把与消息有关的全部细节封装到NSInvocation.再给接收者最后一次机会,令其设法解决当前未处理的消息。
动态方法解析:
对象在收到无法解读的消息后,会调用:
+(BooL)resloveInstanceMethod:(SEL)selector
备援接收者
-(id)forwardingTargetForSelctor:(SEL)selector
完整的消息转发机制
创建NSInvocation对象,把未处理的消息有关的全部细节都封于其中,此对象包含选择子,目标,及参数。
实现此方法时,若发现某调用操作不应由本类处理,则需调用超类的同名方法。直至NSObject.如果最后调用了NSObject方法,那么该犯法会继续调用“doesNotRecongnizeSelector”.
-(void)forwardInvoation:(NSInvocation*)invocation