2

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

4

2 回答 2

2

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

一个警告是 ARC 依赖于符合基本内存管理规则中概述的方法命名规则的代码。因此,您的非 ARC 代码必须遵守这些方法命名规则,否则 ARC 可能无法正确处理生成的对象。如果非 ARC 代码遵循长期存在的方法命名约定(以alloc, new,copy和问题。但是如果你的非 ARC 代码不遵循这个方法命名约定,但是在将这个非 ARC 代码与你的 ARC 类集成时,它可能会成为内存管理的绊脚石。mutableCopyautorelease

如果非 ARC 代码不符合这些命名约定,您要么必须重命名方法,更正代码的内存管理以对应方法名称,要么在代码不符合这些规范的情况下为编译器提供提示方法命名规则(例如NS_RETURNS_RETAINEDor NS_RETURNS_NOT_RETAINED)。

于 2013-09-18T14:13:22.607 回答
1

ARC 所做的是查看您的代码并假设您的对象应该在哪里释放、自动释放等。在编译时,所有的保留、释放、retainCount、自动释放或释放方法都将添加到您的代码中。这使您的非弧码与您的弧码完全兼容。

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

希望这会有所帮助,干杯!

于 2013-09-18T13:25:01.250 回答