覆盖ARC下的保留/释放

时间:2013-05-07 11:47:26

标签: ios objective-c automatic-ref-counting

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

它有效,但它非常脆弱,有更好的解决方案,不涉及与内存管理串通缓存。

答案 1 :(得分:-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测试它们。还有一篇原创文章: link

相关问题