之前写了
method swizzling的重新认识,这篇isa swizzling就只能是不求甚解了。A pointer to the class definition of which this object is an instance.实例对象的
isa,是一个指向该对象的类的指针。而
isa swizzling,表示修改一个对象的isa,指向另一个类的指针。以下方法效果类似
- object_setClass
- self->isa = g_zombieClass;
- memcpy(obj, &g_zombieClass, sizeof(void*));
下面我们来看看有哪些地方用到了这个技术。
KVO
最典型的例子当属官方的KVO。
Automatic key-value observing is implemented using a technique called isa-swizzling.Zombie Objects
Xcode调试内存问题的Zombie Objects技术,通过保存释放对象的内存地址,使得更容易检测内存错误(
EXC_BAD_ACCESS)。我们也可以自己实现。
或者参考网易杭州前端技术部的对于线上环境的野指针Crash防护
或者看看
chromium for iOS的有点不一样的实现Setting |isa| rather than using |object_setClass()| because that function is implemented with a memory barrier.
Aspect
然后是开源多年来大名鼎鼎的
Aspect,AOP利器。Stinger
近年来国内也有优秀的
Aspect同类的开源轮子。饿了么的
StingerSDMagicHook
字节跳动的
SDMagicHook小结
无脑罗列了一堆,不求甚解,之后还是要花时间逐个研究一下,不然像字节跳动的
SDMagicHook的作者未了解过Aspect就造轮子开源并发表公司文章,难免有点尴尬。遗憾的是,目前为上,无论是method swizzling还是isa swizzling,都似乎没有完美互相兼容的hook方案。其他hook方案还有facebook的fishhook,以及使用汇编对objc_msgSend的hook,有待研究。
Loading Comments...