这是一个示例代码,只释放“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对象怎么样?他们为什么不释放它?它不是通过引用返回的......?
答案 0 :(得分:6)
类似于您不需要发布error
的原因,您也不需要发布nameOfFile
。在Objective-C中,如果将字符串声明为NSString *temp = @"Hello"
,则将其视为字符串常量,并且不需要释放它。内存引用计数为零,因此无需释放。
答案 1 :(得分:4)
假设nameOfFile
是一个常量字符串,那么它自动保留计数为7fffffff
(即2147483647
,即可能的最高保留计数)。基本上,字符串文字在执行期间持续存在,并且永远不会被释放,因此您永远不必担心释放它们。
请记住,只有在保留对象或为其显式分配内存时才需要释放对象。
有关详细信息,请参阅Apple's documentation。