2009-04-25 34 views
2

这是一个示例代码,其中只有“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对象呢?他们为什么不释放它?它不是通过引用返回...?

回答

4

假设nameOfFile是一个常量字符串,则它自动保留计数为7fffffff(即2147483647,最高可能的保留计数)。基本上,字符串文字在执行期间是持续的,并且永远不会被释放,所以您不应该担心释放它们。请记住,如果您保留了对象或为其显式分配了内存,则只需释放该对象即可。

查看Apple's documentation了解更多信息。

+0

您需要用两个“F”字在十六进制值,或十进制应该是2^23 - 1,而不是2^31 - 1。 – paxdiablo 2009-04-26 00:13:28

6

相似,为什么你不需要释放error,你也不需要释放nameOfFile。在Objective-C中,如果将一个字符串声明为NSString *temp = @"Hello",它将被视为字符串常量,并且不需要释放。内存引用计数为零,因此不需要释放。

相关问题