2

在我的研究中,我遇到了一些奇怪的事情。

@interface Class {
    NSString *_string
}

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

最初我认为这_string是自动释放池的一部分,并且真的没有考虑它的内存方面。

在阅读了这篇 SO 帖子Objective C NSString* 属性保留计数奇怪之后 ,我意识到不,情况并非如此,并且保留计数_string实际上是UINT_MAX

显然,我认为_string作为自动释放池一部分的想法是侥幸,而我处理变量的方式只是以某种方式解决了。不过,我想知道的是:什么时候@"ASDF"被扔掉?我知道我应该使用属性和设置器,但可能有很多代码看起来像这样,因为将常量分配给变量非常直观。

这些不可变的字面量NSStrings 的生命周期是什么?什么时候会因为不再驻留在内存中而[_string length]实际返回错误?@"ASDF"

4

2 回答 2

4

来自文字 NSString 是自动释放还是需要释放?

编译器分配的字符串(格式为@"STRING")是常量,因此给它们的-retain、-release 和-autorelease 消息将被忽略。在这种情况下,您不必释放或自动释放 foo (但它不会受到伤害)。

当你这样做时,在引擎盖下

NSString* yourString = @"ABC";

该字符串将存储在称为数据段的内存区域中。该区域在应用程序启动后永远不会改变。这里的字符串被视为您的应用程序的常量。同时一个字符串是一个对象,所以如果你想保留它,你可以调用retainor copy

当你这样做时

NSString* yourString = // alloc-init

您在堆上创建一个对象。如果您忘记释放,则会发生内存泄漏。如果其他人破坏了它,而您尝试访问它,则您无法访问该内存位置。

希望有帮助。

于 2012-06-28T17:19:09.067 回答
0

手动创建的不可变字符串 (NSString) 遵循正常的引用计数规则和生命周期。

在您的示例中,字符串更加特殊,因为它实际上是字符串文字。与任何文字一样,它们驻留在特殊内存中,并且仅在可执行文件终止时被销毁。

于 2012-06-28T17:17:41.590 回答