【问题标题】:objective-C. Arc library in non-arc目标-C。非弧中的弧库
【发布时间】:2014-01-22 00:54:23
【问题描述】:

我在没有弧的项目中添加了 PESGraph 弧库。

我已经找到了一个答案,它是可能的并且确实有效。但是如何处理非弧项目中弧库中对象的内存。我的意思是至少分配、保留、释放。

例如,如果声明为retain属性,我可以在dealloc方法中为arc中的对象编写release吗?

【问题讨论】:

  • ARC 不会接管您的对象。如果您编写非 ARC 代码,那么您仍然需要手动管理内存(嗯,有时您也必须使用 ARC 来做这件事......)。如果你得到一个 ARC 库返回的对象,你仍然需要在非 ARC 代码中保留和释放它。
  • @H2CO3 您应该将其发布为答案。我不想通过重复您的评论来窃取您的代表。
  • @JustSid 这不值得 :) Rob Mayoff 已经提供了一个很好的答案。

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


【解决方案1】:

如果在禁用 ARC 的情况下编译文件,您可以在该文件中调用 release(以及 retainautorelease),并且您有责任在适当的位置进行这些调用。

ARC 的想法是,当启用 ARC 时,编译器会为您插入这些调用。如果您为某些文件禁用了 ARC,那么您必须自己在这些文件中插入调用。

如果禁用了 ARC,当您需要 retainreleaseautorelease 对象时,Cocoa 有非常严格的约定。阅读Cocoa Core Competencies: Memory Management 开始。如果您需要更多详细信息,请查看Advanced Memory Management Programming Guide。这不是很先进。

启用 ARC 时,编译器遵循相同的约定。这就是为什么您可以在同一个可执行文件中链接启用 ARC 的文件和禁用 ARC 的文件。

【讨论】:

  • 谢谢,就我而言,弧似乎是同时启用和禁用的。
【解决方案2】:

Cocoa 中的内存管理完全是本地的——在一个函数中需要执行哪些内存管理操作可以完全通过仅查看该函数来确定,而无需关心其他代码。每个功能在内存管理方面都可以独立考虑,只要它们都遵循规则即可。 ARC 只是自动执行规则(与您在 MRC 中遵循的规则相同)。代码的不同部分可以独立使用ARC或MRC,互不影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多