objective-c - 关于 NSString 的 iOS 内存管理

标签 objective-c ios

有什么不同

NSString * str = @"123";

NSString * str = [[NSString alloc] initWithString:@"123"];

从编译器的角度?

最佳答案

理论上是的;在实现细节上,可能不是。

在第一种情况下,编译器创建一个常量字符串并将指向它的指针分配给变量str。您不拥有该字符串。

在第二种情况下,编译器创建一个常量字符串(和以前一样),但这次它被运行时用作初始化您拥有的另一个字符串的参数(因为第二个字符串是使用 创建的分配).

这就是您需要了解的内容。

但是,还有很多优化正在进行。因为 NSStrings 是不可变的,你会发现 initWithString: 实际上只是返回参数。通常,它会在将参数返回给您之前保留该参数(因为您希望拥有它)但是文字字符串有一个特殊的 retainCount(我认为是 INT_MAX)来阻止运行时尝试解除分配他们。因此在实践中,您的第二行代码会产生与第一行相同的结果。

顺便说一句,这就是为什么 top 在第一种情况下说字符串是自动释放的原因是不正确的,因为它不是。它只是一个具有特殊保留计数的常量字符串。

但是您可以而且应该放心地忽略实现细节,只需记住,在第一种情况下您不拥有该字符串,但在第二种情况下您拥有它。

关于objective-c - 关于 NSString 的 iOS 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923715/

相关文章:

ios - 将按钮放在 UIImageView 的右上角

一个 .h 和 .m 中的 Objective-C 多个类定义

iphone - 使用 magicalrecord 替代 fetchedResultsController 代码?

iphone - 从服务器加载 "weird characters"的标签

iphone - Xcode - 在自定义配置中排除文件 - 更好的方法?

ios - subview 位置不正确

ios - 在我的 iPhone 应用程序中,我试图在 Tableview 中实现 UISearchBar

Xcode 5.1.1 上的 ios 7.0 模拟器

ios - 如何从其子类正确访问父类(super class) View Controller 的 IBOutlet 属性?

ios - 如何在 IOS 中动态设置背景颜色?