Objective-C如何处理不可变字符串的内存

时间:2012-06-28 17:06:44

标签: objective-c cocoa memory-management nsstring literals

在我的研究中,我遇到了一些特殊的东西。

@interface Class {
    NSString *_string
}

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

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

阅读此SO帖子后Objective C NSString* property retain count oddity 我意识到不是,情况并非如此,_string的保留计数实际上是UINT_MAX

显然我认为_string是自动释放池的一部分是一个侥幸,我如何处理变量只是以某种方式解决了。但我想知道的是:@"ASDF"何时被抛弃?我知道我应该使用属性和setter,但是可能有很多代码看起来像这样,因为为变量赋值是非常直观的。

这些不可变的文字NSString的生命周期是什么,以及[_string length]何时实际返回错误,因为@"ASDF"不再驻留在内存中?

2 个答案:

答案 0 :(得分:3)

来自Is a literal NSString autoreleased or does it need to be released?

  

编译器分配的字符串(格式为@“STRING”)是常量,和   所以-retain,-release和-autorelease消息被忽略了。   在这种情况下,您不必释放或自动释放foo(但它   不会受伤)。

当你做

NSString* yourString = @"ABC";

该字符串将存储在称为数据段的内存区域中。应用程序启动后,此区域永远不会更改。此处字符串被视为应用程序的常量。同时字符串是一个对象,因此如果您想保留它,请拨打retaincopy

当你做的时候在

NSString* yourString = // alloc-init

在堆上创建一个对象。如果您忘记释放,则会发生内存泄漏。如果其他人销毁它,并且您尝试访问它,则您对该内存位置的访问权限很差。

希望有所帮助。

答案 1 :(得分:0)

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

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