在我的研究中,我遇到了一些特殊的东西。
@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"
不再驻留在内存中?
答案 0 :(得分:3)
来自Is a literal NSString autoreleased or does it need to be released?
编译器分配的字符串(格式为@“STRING”)是常量,和 所以-retain,-release和-autorelease消息被忽略了。 在这种情况下,您不必释放或自动释放foo(但它 不会受伤)。
当你做
时NSString* yourString = @"ABC";
该字符串将存储在称为数据段的内存区域中。应用程序启动后,此区域永远不会更改。此处字符串被视为应用程序的常量。同时字符串是一个对象,因此如果您想保留它,请拨打retain
或copy
。
当你做的时候在
NSString* yourString = // alloc-init
在堆上创建一个对象。如果您忘记释放,则会发生内存泄漏。如果其他人销毁它,并且您尝试访问它,则您对该内存位置的访问权限很差。
希望有所帮助。
答案 1 :(得分:0)
手动创建的不可变字符串(NSString)遵循正常的引用计数规则,因此遵循生命周期。
在您的示例中,字符串更加特殊,因为它实际上是一个字符串文字。与任何文字一样,它们驻留在特殊内存中,只有在可执行文件终止时才会被销毁。