Bry*_*hen 3 objective-c ios automatic-ref-counting
我有一个使用ARC的应用程序,它使用MRC(非ARC)静态库.在静态库中,retain/ release被覆盖以提供一些自定义弱引用/缓存行为([super retain/release]当然称为).问题是,在启用ARC的代码中不允许retain/ release不允许使用在启用ARC的代码中覆盖retain/的类是否可以release?目前它似乎运作良好,但我不确定这是否依赖于未来可能会破坏的未定义行为.
还有什么理由禁止覆盖retain/ release?是因为编译器完成了一些特殊的优化,绕过了消息绑定过程来加速方法调用?我知道_objc_storeStrong调用是由执行引用计数的编译器生成的,所以这是否意味着被覆盖retain/ release不能保证在ARC下被调用?
只要在没有ARC的情况下编译类(您可以逐个文件地控制它们;转到构建阶段并将其-fno-objc-arc作为标志添加到应该在ARC'd项目中编译MRR的任何文件),然后是MRR编译后的类可以覆盖retain/release/autorelease到他们内心的内容.
保留/释放/自动释放在ARC下是禁止的,因为ARC旨在在编译时为您处理所有内存管理,同时也强制您将内存管理与其他似乎可以堆积到内存管理中的角色分开,但实际上并非如此属于那里.
例如,最典型的覆盖release涉及检查retainCount和,如果它是2,则转换为1意味着"将此对象放回缓存中以供以后检索",而缓存负责最终保留对该对象的引用.
它有效,但它非常脆弱,有更好的解决方案,不涉及与内存管理串通缓存.