-->

如何Objective-C的处理不可变字符串的内存[复制](How Objective-C hand

2019-10-16 22:35发布

这个问题已经在这里有一个答案:

  • 我需要释放一个恒定的NSString? 2个回答

在我的研究中我遇到一些奇特。

@interface Class {
    NSString *_string
}

- (void) Method1 {
    _string = @"ASDF";
}

Intially我认为_string是自动释放池的一部分,真的没有去想它的记忆方面。

阅读本SO文章后目标C的NSString *财产保留计数怪胎我已经意识到,不,这是不是这样,那的保留计数_string实际上是UINT_MAX

显然,我的思想, _string是自动释放池的一部分是侥幸,我该怎么处理的变量就是不知怎么解决。 我想知道,虽然是:什么时候@"ASDF"得到扔掉? 我知道我应该使用性质和setter方法,但可能有大量的代码在那里,看起来像这样因为一个变量分配常数如此直观。

什么是不可改变的这些,字面生命周期NSString s,而当将[_string length]实际上,因为返回错误@"ASDF"不驻留在内存中了吗?

Answer 1:

从是文字的NSString自动释放还是需要被释放?

编译器分配的字符串(格式@“STRING”)是恒定的,所以-retain, - 释放,并给他们的消息-autorelease被忽略。 您不必在这种情况下释放或自动释放富(但它不会伤害)。

在当你做引擎盖

NSString* yourString = @"ABC";

该字符串将被存储在存储器称为数据段的区域。 应用程序启动后,此区域永远不会改变。 这里字符串都被视为对您的应用程序常数。 同时,一个字符串是一个对象,因此,如果你想保持它,你叫retaincopy

在当你做contary

NSString* yourString = // alloc-init

您在堆上创建一个对象。 如果你忘记释放你有内存泄漏。 如果有人破坏它,并且您尝试访问它,你有一个坏访问该存储器位置。

希望帮助。



Answer 2:

被手动创建的不可变的字符串(的NSString)如下正常参考计数规则和由此的生命周期。

在你的榜样,因为它实际上是一个字符串文字字符串是更加特别。 因为对于任何文字的情况下,他们居住在特殊的内存和当终止执行仅被摧毁。



文章来源: How Objective-C handles the memory of immutable strings [duplicate]