ios - 将非 ARC 转换为 ARC

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

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

由于ARC和非ARC的混合使用,有时会发生内存泄漏,因为非ARC代码中忘记释放某处,而从这里切换到那里可能会导致这种情况。

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

Convert non-ARC to ARC project without recreate it

并且只是通过删除 release 或 autorelease 相关的东西来删除 dealloc、viewDidUnload 函数内容。

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

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

我想从这里知道的是;

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

任何输入将不胜感激!

最佳答案

自动引用计数 (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

关于ios - 将非 ARC 转换为 ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30525102/

相关文章:

ios - 使用静态 UITableViewController 创建两个部分,第一部分具有非静态数量的单元格

ios - UIAlerview 的 NSUserDefaults

xcode - 在现代 Swift OSX 应用程序中组织 XIB 和 Storyboard

iphone - iPhone应用程序崩溃?

ios - 没有m3u8扩展名的swift stream hls

ios - xamarin.forms ios应用程序开始随机崩溃

android - 如何创建多平台本地化解决方案?

iphone - 检查 NSData 是否包含 NSString 的可能性

objective-c - 仅在第一次运行 iOS 时执行功能

iOS 水平菜单 w ScrollView