2

这是一个示例代码,其中仅释放“字符串”对象。

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

2 回答 2

6

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

于 2009-04-25T21:32:12.850 回答
4

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

请记住,如果您保留了一个对象或为它显式分配了内存,您只需要释放它。

有关详细信息,请参阅Apple 的文档

于 2009-04-25T21:47:03.627 回答