无Foundation/CoreFoundation下仅用libobjc实现@autoreleasepool的方案咨询
无Foundation环境下实现@autoreleasepool的思路探讨
注:所有提及的libobjc均指Apple的runtime,GNU runtime将后续处理。
我正试图搞清楚@autoreleasepool在运行时的具体工作机制,好能在没有Foundation框架的环境里使用它。目前我已经成功hook了@()、@[]和@{},返回自定义的数字、数组、字典类实例——这些类均派生自我的根类,且因所有底层逻辑都在objc中实现,修改起来更便捷。但@autoreleasepool的编译处理方式明显不同。
编译器并未注入[[NSAutoreleasePool alloc] init]和[pool release]这类可在objc层交换的调用,而是直接插入了运行时中的两个私有C函数:objc_autoreleasePoolPush()和objc_autoreleasePoolPop()……而且这两个C函数并不会调用[[NSAutoreleasePool alloc] init]和[pool release]。
我之前以为调用objc_autoreleasePoolPush()会创建新池并推入池栈,但它的返回值是0x01,这应该是某种标记/占位值——显然不是NSAutoreleasePool实例。
现在我需要实现以下任一方案:
- 方案A:拦截
@autoreleasepool编译时注入的NSAutoreleasePool的分配、初始化、释放操作,从而分配、初始化、释放自定义自动释放池类的实例; - 方案B:实现独立的编译后二进制补丁步骤,将这些C函数的调用替换为自定义对应函数的地址。
请问针对任一方案有什么可行思路?
内容的提问来源于stack exchange,提问作者Jason L.
相关产品推荐
相关产品推荐

