有关NSString的iOS内存管理

有关NSString的iOS内存管理

两者之间有什么不同吗

NSString * str = @"123";




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


从编译器的角度来看?

最佳答案

从理论上讲是的;在实施细节上,可能不是。

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

在第二种情况下,编译器将创建一个常量字符串(如前所述),但是这次它在运行时用作初始化您拥有的另一个字符串的参数(因为第二个字符串是使用alloc创建的)。

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

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

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

但是您可以并且应该安全地忽略实现细节,只记得,在第一种情况下您不拥有字符串,而在第二种情况下您确实拥有它。

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

10-10 20:45