为什么我不必释放这些物体?

时间:2009-04-25 21:25:09

标签: objective-c iphone cocoa-touch memory-management uikit

这是一个示例代码,只释放“string”对象。

NSString *nameOfFile = ... ;
NSError *error;
NSString *string = [[NSString alloc] initWithContentsOfFile:nameOfFile encoding:NSUTF8StringEncoding error:&error];
if (string == nil) {
    // handle error
}
[string release];

我理解为什么不释放错误对象。这是因为此处的方法没有使用“new”或“alloc”方法创建该错误对象。相反,这个是通过引用返回的,因此initWithContentsOfFile方法负责该内存。但是nameOfFile对象怎么样?他们为什么不释放它?它不是通过引用返回的......?

2 个答案:

答案 0 :(得分:6)

类似于您不需要发布error的原因,您也不需要发布nameOfFile。在Objective-C中,如果将字符串声明为NSString *temp = @"Hello",则将其视为字符串常量,并且不需要释放它。内存引用计数为零,因此无需释放。

答案 1 :(得分:4)

假设nameOfFile是一个常量字符串,那么它自动保留计数为7fffffff(即2147483647,即可能的最高保留计数)。基本上,字符串文字在执行期间持续存在,并且永远不会被释放,因此您永远不必担心释放它们。

请记住,只有在保留对象或为其显式分配内存时才需要释放对象。

有关详细信息,请参阅Apple's documentation