之前写了
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
同类的开源轮子。饿了么的
Stinger
SDMagicHook
字节跳动的
SDMagicHook
小结
无脑罗列了一堆,不求甚解,之后还是要花时间逐个研究一下,不然像字节跳动的
SDMagicHook
的作者未了解过Aspect
就造轮子开源并发表公司文章,难免有点尴尬。遗憾的是,目前为上,无论是method swizzling还是isa swizzling,都似乎没有完美互相兼容的hook方案。其他hook方案还有facebook的fishhook,以及使用汇编对objc_msgSend的hook,有待研究。
Loading Comments...