复习一遍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

 

posted @ 2014-11-02 22:35  wtndcs  阅读(236)  评论(0编辑  收藏  举报