3

我有一个使用 MRC(非 ARC)静态库的启用 ARC 的应用程序。在静态库中,retain/release被覆盖以提供一些自定义的弱引用/缓存行为([super retain/release]当然被称为)。问题是,由于retain/release在启用 ARC 的代码中不允许使用,是否可以在启用 ARC 的代码中使用覆盖retain/release的类?目前它似乎运行良好,但我不确定这是否依赖于将来可能会中断的未定义行为。

还有什么是禁止覆盖retain/的原因release?是不是因为编译器做了一些特殊的优化,绕过了消息绑定过程来加快方法调用?我知道_objc_storeStrong调用是由执行引用计数的编译器生成的,那么这是否意味着不能保证在 ARC 下调用覆盖的retain/ ?release

4

2 回答 2

5

只要这些类是在没有 ARC 的情况下编译的(您可以逐个文件控制它;转到 Build Phases 并将-fno-objc-arc作为标志添加到应该在其他 ARC 项目中编译 MRR 的任何文件),然后 MRR编译的类可以覆盖保留/释放/自动释放到他们的核心内容。

保留/释放/自动释放在 ARC 下是禁止使用的,因为 ARC 旨在在编译时为您处理所有内存管理,同时还迫使您将内存管理与其他看似可以堆放在内存管理上的角色分开,但实际上不要属于那里。

例如,最典型的覆盖release涉及检查retainCountand,如果它是 2,则转换为 1 意味着“将此对象放回缓存以供以后检索”,而缓存负责对对象的最终保留引用。

它可以工作,但它非常脆弱,并且有更好的解决方案不涉及将缓存与内存管理相勾结。

于 2013-05-07T17:24:36.337 回答
-4

覆盖保留/释放是不正确的。但如果你需要它:

-(id)retain
{
   NSIncrementExtraRefCount(self);
    return self;
}

-(void)release
{
    if(NSDecrementExtraRefCountWasZero(self))
    {
         NSDeallocateObject(self);
    }
}

-(id)autorelease
{  // Add the object to the autorelease pool
    [NSAutoreleasePool addObject:self];
    return self;
}

我还没有对它们进行 ARC 测试。还有一篇原创文章: 链接

于 2013-05-07T13:20:30.733 回答