将非ARC转换为ARC

时间:2015-05-29 08:45:07

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

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

由于混合使用ARC和非ARC,有时会出现memory leak,因为忘记在非ARC代码中释放,并从此处切换到那里可能会导致此问题。

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

Convert non-ARC to ARC project without recreate it

刚刚通过删除释放或自动释放相关的东西删除了dealloc,viewDidUnload函数内容。

成功完成之后,似乎可以继续工作,但有时会像发送到解除分配的实例的消息一样崩溃。

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

我想从这里知道的是;

  • 转换时,是否有任何具体的指南或规则来执行此操作而不是简单地删除发布,自动释放相关的声明?

任何输入都将非常感谢!

3 个答案:

答案 0 :(得分:1)

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

请参阅此网址: -

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

如上所述,在 ARC 中,我们不需要添加release和retain方法,因为编译器会对此进行处理。实际上,Objective-C的基本过程仍然是相同的。它在内部使用保留和释放操作,使开发人员更容易编码而无需担心这些操作,这将减少编写的代码量和内存泄漏的可能性。

还有一个名为垃圾收集的原则,它在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

答案 1 :(得分:0)

xcode可以单独完成转换。在大多数情况下,它足以删除这些陈述。您需要检查属性声明@property(nonatomic, weak/strong/copy)

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

答案 2 :(得分:0)

按照事情

步骤1:转到Project Target并单击Build Phases

步骤2:单击编译源。您可以在其中看到所有.m文件

步骤3:双击它,光标会出现白框。

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