ARC和非ARC NSString初始化

最近,我在Objective-C / iOS程序中使用了自动引用计数function,并且真正享受了这个function。

有一件事我不明白这是正确的方法来初始化一个NSString 。 我已经看到这个方法与ARC和非ARC项目一起使用:

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

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

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

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

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

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

使用ARC,这种差异仍然很大。 自动释放的对象仍然堆积如山,因为自动释放池只在运行循环的每个循环中消耗,即使使用ARC,所以如果你有一个循环创build许多自动释放的对象(即它们使用NSString便利方法或其他),你的峰值内存足迹可能会上升。 使用-alloc -init版本更好的是这个原因。 过去这个和ARC没什么区别。

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

所有这一切,你可能不需要担心创build一个string的两种方法之间的差异。 无论哪个人感觉更好,并使得更简洁易读的代码将是更好的方法。

要么就好。 如果您手动pipe理内存,则对它们的处理方式会有所不同,但如果您使用的是ARC,则不会有任何问题。