ARC和非ARC NSString初始化

时间:2012-07-19 02:37:12

标签: 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!"];

这两者有什么区别吗?有没有正确的方法?是否更好?

3 个答案:

答案 0 :(得分:4)

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

使用ARC,这种差异仍然很大。自动释放的对象仍然堆积起来,因为自动释放池只排出的运行循环的每个周期中,即使有ARC,所以如果你有一个循环产生大量被自动释放的对象(即它们使用NSString方便的方法或其他),你的峰值内存足迹可能上升。因此,使用-alloc -init版本更好。过去,与ARC的差别很小。

This answer给出了自动释放池中发生的事情的一个很好的解释,Jon谈到的概念仍然适用于ARC代码,因为ARC没有摆脱-retain,{{ 1}}和-release,它只是为您插入这些内存管理代码。

所有这些,您可能不需要担心创建字符串的两种方法之间的区别。无论哪种感觉更好,并且使代码更简洁易读,将是更好的方法。

答案 1 :(得分:2)

要么就好了。如果您手动管理内存,则会对它们进行不同的处理,但如果您使用ARC,则无关紧要。

答案 2 :(得分:2)

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