复习一遍effective object c
周末复习一遍effective object c,按道理讲前面看过一遍,这次再看主要是把一些模拟两可的再重新确认一下;哎,买的深入解析Mac OS X才看了一点点就放下了,最近几个月感觉没有进步;加油吧。
主要明确点:
1. Object 对象运行期间包括实例的结构、isa变量,指向内存中的类对象,类对象中的isa指向类meta对象(用于查类方法)
kvo动态的将实例的isa指针指向一个动态生成的类对象,该类对象中用于自动做kvo通知
object_setClass
2. dynamic是不让编译器缺省生成getter和setter,而是运行期间确认
3. 消息转发机制,object c这个机制还是很强大的,分别会调用resolveInstanceMethod或resolveClassMethod去做相关方法插入,如果没有调用forwardingTargetForSelector,如果还是没有调用forwardInvocation。谈到消息转发,NSProxy可以作为aop使用
4. object c的异常一般用于严重错误,一般来讲不太常用,如果要使用注意fobjc-arc-exceptions编译
5. retaincount其实在mrc下可以使用的
6. NSDictionary会copy键,NSCache只是增加键的引用计数;另外,NSCache的多线程比较好 ,其实可以考虑相关锁达到目的
7. GCD 桥接等问题,还有个死锁
8. runloop arc原理
9. initialize 和load
Category中的+initialize方法会覆盖类本身的+initialize方法,也就是说一个类所有扩展加起来只有一个initialize入口,也就是只会调用一次;所以Category只能使用load
另外,load中按照启动过程分析是没有到autoreleasepool的,不过这个是否会触发内存回收待定。
Q: 重载load时需要手动添加@autoreleasepool么?
A: 不需要,在runtime调用load方法前后是加了objc_autoreleasePoolPush()
和objc_autoreleasePoolPop()
的。
10.kvc是如何实现的,其实可以考虑例如消息转发的机制,达到目的;不过具体实现可能相对复杂
11.aop的实现可以通过isa、runtime change method和nsproxy实现
如果说是只针对一个实例的话,那么isa和nsproxy使用,如果是针对所有实例,那么通过runtime change method