最近,我一直在我的 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/