在ARC下重写retain/release方法

3
我有一个启用了ARC的应用程序,使用了一个MRC(非ARC)的静态库。在静态库中,retain/release被重写以提供一些自定义的弱引用/缓存行为(当然会调用[super retain/release])。问题是,由于在启用ARC的代码中不允许使用retain/release,那么在启用ARC的代码中使用重写了retain/release的类是否可行?目前似乎工作得很好,但我不确定这是否依赖于未定义的行为,可能会在将来出现故障。
此外,禁止重写retain/release的原因是什么?是因为编译器进行了某些特殊的优化,绕过消息绑定过程以加快方法调用速度吗?我知道编译器生成了_objc_storeStrong调用来进行引用计数,这是否意味着在ARC下重写的retain/release不能保证被调用?

ARC只是自动维护内存管理,也就是说,它会根据对象的作用域自动添加保留/释放代码。因此,不必担心那些没有启用ARC的库,它们在未来也不会造成任何问题。 - P.J
2个回答

5
只要类没有使用ARC编译(可以在文件级别上进行控制;转到Build Phases并添加-fno-objc-arc作为标志,以使在否则使用ARC的项目中编译MRR),那么MRR编译的类可以尽情覆盖retain/release/autorelease。
由于ARC被设计用来处理所有内存管理,并将内存管理与其他角色分开,因此在ARC下不允许使用retain/release/autorelease。
例如,最常见的release覆盖涉及检查retainCount。如果它是2,则过渡到1意味着“将此对象放回缓存以供以后检索”,而缓存负责对对象的最终保留引用。
这种方法虽然有效,但容易出错,有更好的解决方案,不需要将缓存与内存管理混合处理。

-4

覆盖 retain/release 是不正确的。但如果你需要它:

-(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


7
在ARC中,您无法覆盖retain/release。即使可以这样做,也不能回答这个问题。 - bbum
你可以这样做,但这并没有回答 OP 的问题。该库已经使用自定义实现覆盖了 retain/release。OP 不需要关于如何覆盖 retain/release的说明,OP 特别询问为什么在 ARC 下它会出现问题以及该怎么办。我在上面已经解释了。 - bbum
看一下我帖子的开头。我已经写了那是不正确的,但这里有另一个网站的例子。我该怎么办? - user2159978
如果你无法回答提问者的问题,那就不要回答。有很多关于UIKit细节的问题我都会跳过,因为我无法回答它们。事实上,我经常搜索一个问题的答案,最终在SO上找到了一个问答对,并且会点赞问题和答案,因为它们非常有帮助! - bbum
这是一个非常长的时间来对某人的评论感到冒犯。如果你不同意,那很好,但告诉别人该怎么做并不能让你变得更好。 - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接