objective-c - ARC 和非 ARC NSString 初始化

标签 objective-c ios cocoa-touch nsstring automatic-ref-counting

最近,我一直在我的 Objective-C/iOS 程序中使用自动引用计数,并且非常喜欢这个功能。

我不明白的一件事是初始化 NSString 的正确方法。我已经看到这种方法用于 ARC 和非 ARC 项目:

NSString *myClassicString = [[NSString alloc] initWithFormat:@"My great non-ARC string!"];

我还发现下面的方法可以用来在ARC中初始化一个NSString,我更喜欢它因为方便:

NSString *myARCString = [NSString stringWithFormat:@"My new simple initialization string!"];

这两者有什么区别吗?有正确的方法吗?哪一个更好?

最佳答案

在 ARC 之前,这两种方法之间存在显着差异。第一个是 alloc init 方法,它产生了一个由调用者拥有的对象——它必须手动释放,否则会发生内存泄漏。另一个,+stringWithFormat: 是一个方便的方法,它产生一个不需要显式释放的自动释放对象。

对于 ARC,这种差异仍然很明显。自动释放的对象仍然堆积,因为自动释放池仅在运行循环的每个循环中被耗尽,即使使用 ARC,所以如果您有一个循环创建大量自动释放的对象(即它们使用 NSString 便利方法或其他),您的峰值内存足迹可能会增加。出于这个原因,使用 -alloc -init 版本更好。除此之外,与 ARC 几乎没有区别。

This answer很好地解释了这里发生的自动释放池的情况,并且 Jon 谈论的概念仍然适用于 ARC 代码,因为 ARC 没有摆脱 -retain-release-autorelease,它只是为您插入那些内存管理代码。

综上所述,您可能不需要担心这两种创建字符串的方法之间的区别。无论哪种方式对您来说感觉更好,代码更简洁易读,都将是更好的方法。

关于objective-c - ARC 和非 ARC NSString 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553164/

相关文章:

iphone - 增强现实室内

objective-c - 轻松加载动画

关于 NSString NSInteger 和方法调用的 Objective-C 问题

iphone - 如何创建图像叠加层并将其添加到 MKMapView?

objective-c - NSManagedObject 的 NSPasteboard 类型

ios - 多个导航 Controller

ios - 如何在自定义表格 View 单元格之间传递数据?

ios - 为什么必须先初始化NSObject的.class-property才能对其进行初始化

ios - UIImageView 无法识别我的点击事件

iphone - 激活 iPhone 键盘