为什么"选择器x的已知方法"不是ARC下的硬错误?

Chr*_*eux 4 cocoa cocoa-touch objective-c automatic-ref-counting

也许如果调用一个MyClass对某个类型的MyClass不理解的方法是一个错误而不是一个警告,因为它可能是一个错误或将来会导致错误...

但是,为什么这个错误特定于ARC?ARC根据可可内存管理约定决定它需要保留/释放/自动释放的内容,这表明知道选择器的名称就足够了.因此,将SEL变量传递给它是有道理的performSelector:,因为在编译时不知道选择器是否是init/copy/new方法.但为什么在类接口中看到这一点或没有任何区别?

我是否遗漏了ARC的工作方式,或者铿锵警告是否有点不一致?

Rob*_*ier 9

ARC根据可可内存管理约定决定它需要保留/释放/自动释放的内容,这表明知道选择器的名称就足够了.

这只是ARC确定内存管理的一种方式.ARC还可以通过属性确定内存管理.例如,您可以声明任何typedef可保留使用 __attribute__((NSObject))(永远不会这样做,但它是合法的).您还可以使用其他属性__attribute((ns_returns_retained))和其他几个属性来覆盖命名约定(如果您无法修复命名,这些是您可能合理做的事情;但是修复命名要好得多).

现在,想象一下您未能包含在某些文件中声明这些属性而不是其他文件的头文件的情况.现在,一些编译单元(.m文件)内存以一种方式管理它,一些内存管理另一种方式.Hijinks确保.这比没有ARC的情况要糟糕得多,而且由此产生的错误会导致错误,因为一些ARC代码会做一件事而其他ARC代码会做一些不同的事情.

所以,是的,不要这样做.(当然,你永远不应该忽视Objective-C中的警告,但这是一个特别令人讨厌的情况.)