【问题标题】:convert non-ARC to ARC将非 ARC 转换为 ARC
【发布时间】:2015-08-12 01:20:28
【问题描述】:

我正在处理非常旧的非 ARC 项目,并添加了一些基于 ARC 的新 UIViewControllers(可以通过在构建阶段设置 -fobjc-arc 标志来实现)。

由于混合使用 ARC 和非 ARC,有时会出现 memory leak,因为忘记在非 ARC 代码中的某个位置发布,从这里切换到那里可能会导致这种情况。

因此,我决定将非 ARC 项目转换为 ARC 项目并按照以下方式进行;

Convert non-ARC to ARC project without recreate it

而且刚刚去掉了dealloc、viewDidUnload函数内容,去掉了release或者autorelease相关的东西。

成功完成后,似乎可以继续工作,但有时会崩溃,例如发送到已释放实例的消息。

我可以找到崩溃的原因并且可以修复。

我想从这里知道的是;

  • 在转换时,是否有任何特定的指南或规则来执行此操作,而不是简单地删除发布、自动发布相关的语句?

我们将不胜感激!

【问题讨论】:

    标签: ios objective-c xcode memory-leaks automatic-ref-counting


    【解决方案1】:

    自动引用计数 (ARC) 是一种编译器功能,可提供 Objective-C 对象的自动内存管理。

    参考这个网址:-

    https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

    如上所述,在 ARC 中,我们不需要添加释放和保留方法,因为编译器会处理这些方法。其实Objective-C的底层流程还是一样的。它在内部使用了保留和释放操作,使开发人员可以更轻松地编写代码而不必担心这些操作,这将减少编写的代码量和内存泄漏的可能性。

    还有一个叫做garbage collection的原则,在 Mac OS-X 中和 MRR 一起使用,但是自从它在 OS-X Mountain Lion 中被弃用后,就没有和 MRR 一起讨论过。此外,iOS 对象从来没有垃圾收集功能。并且使用 ARC,在 OS-X 中也没有使用垃圾收集。

    这是一个简单的 ARC 示例。请注意,这不适用于在线编译器,因为它不支持 ARC。

    #import <Foundation/Foundation.h>
    
    @interface SampleClass:NSObject
    - (void)sampleMethod;
    @end
    
    @implementation SampleClass
    
    - (void)sampleMethod
    {
       NSLog(@"Hello, World! \n");
    }
    
    - (void)dealloc 
    {
      NSLog(@"Object deallocated");
    }
    
    @end
    
    int main()
    {
       /* my first program in Objective-C */
       @autoreleasepool{
           SampleClass *sampleClass = [[SampleClass alloc]init];
           [sampleClass sampleMethod];
           sampleClass = nil;
       }
       return 0;
    }
    

    得到以下输出...

    demo :- Hello, World!
    demo :- Object deallocated
    

    【讨论】:

      【解决方案2】:

      xcode 可以单独完成大部分转换。在大多数情况下,它足以删除此语句。你需要检查属性声明@property(nonatomic, weak/strong/copy)。

      这是一个小教程: https://objectpartners.com/2013/07/17/converting-an-ios-project-to-use-arc-automatic-reference-counting/

      【讨论】:

        【解决方案3】:

        跟着事情走

        第 1 步:转到项目目标并单击构建阶段

        第 2 步:点击 Compile Sources。您可以在其中看到所有 .m 文件

        STEP 3: 双击它,会出现带有光标的白框。

        第 4 步:在非 arc 文件所在的位置给出 -fno-objc-arc。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多