2

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

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

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

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

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

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

4

3 回答 3

4

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

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

这个答案很好地解释了自动释放池在这里发生的事情,Jon 谈到的概念仍然适用于 ARC 代码,因为 ARC 没有摆脱-retain,-release-autorelease,它只是插入那些内存管理代码你。

话虽如此,您可能不必担心两种创建字符串的方法之间的区别。无论哪种方式对您来说感觉更好,并且使代码更简洁易读,都是更好的方法。

于 2012-07-19T02:45:35.557 回答
2

任何一个都很好。如果您手动管理内存,它们的处理方式会有所不同,但如果您使用的是 ARC,这些都不重要。

于 2012-07-19T02:44:00.810 回答
2

两种方法都是一样的。NSString在初始化方面没有一个比另一个更好。

于 2012-07-19T02:44:05.877 回答