使用ARC的对象包含多个非ARC对象时会发生什么?

时间:2013-09-18 13:18:59

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

我有一个使用ARC的A类和其他没有的B和C类。如果A包含B类对象而B包含C类对象,那么ARC如何工作以及在B类和C类中未正确处理内存管理时会发生什么?

2 个答案:

答案 0 :(得分:2)

我同意Mike和Martin的看法,ARC类中非ARC对象的集成通常是无缝的(假设您已将-fno-objc-arc编译标志添加到那些不是的.m文件中ARC或在使用手动引用计数编译的库中。

有一点需要注意,ARC依赖于符合Basic Memory Management Rules中概述的方法命名规则的代码。因此,您的非ARC代码必须符合这些方法命名规则,否则ARC可能无法正确处理生成的对象。如果非ARC代码遵循长期的方法命名约定(从allocnewcopymutableCopy开始的方法将返回+,则这不是问题1个对象,以及从方法返回的对象将是autorelease个对象),因此通常不是问题。但是,如果您的非ARC代码不遵循此方法命名约定,但在将此非ARC代码与ARC类集成时,它可能会成为内存管理的绊脚石。

如果非ARC代码不符合这些命名约定,则必须重命名方法,更正代码的内存管理以对应方法名称,或者为编译器提供代码不提供的提示遵守这些方法命名规则(例如NS_RETURNS_RETAINEDNS_RETURNS_NOT_RETAINED)。

答案 1 :(得分:1)

ARC的作用是查看代码并假设您的对象应该被释放,自动释放等。在编译时,所有retain,release,retainCount,autorelease或dealloc方法都将添加到您的代码中。这使得非弧代码与弧代码完全兼容。

对于不正确的内存管理,尝试在构建时使用静态分析器来获取尽可能多的错误。

希望这会有所帮助,欢呼!