iPhone中的对象释放行为

时间:2010-11-26 10:19:00

标签: objective-c object

如果我在下面的示例中释放mainPath,程序会出错(因为我发布了一个零计数器的对象)

NSString  *mainPath = [NSString stringWithFormat:@"%@/Documents/downloadFile.plist",NSHomeDirectory()];
NSLog(@"address is = %@",mainPath);
[mainPath release]; //Program failed here

但是下面的代码工作正常。

NSString *aa=@"hiiiii";
[aa release];

任何人都能解释一下吗?

实际上我并不清楚指针的概念(给出一个合适的链接来清除它)

4 个答案:

答案 0 :(得分:3)

您应该阅读Scott Stevenson的Cocoa Memory Management Guide或至少Objective-C Tutorial。 (真的。这样做,从长远来看,你会节省很多时间。)不同之处在于第一个字符串是自动释放的,你不拥有它,不应该释放它。第二个字符串是特殊的,我认为它根本没有在堆上分配,release本质上是一个无操作。

答案 1 :(得分:3)

常量NSStrings是一种特殊情况。它们在编译时静态分配,无法取消分配。你可以根据需要多次发送一个常量字符串,它永远不会被释放。这在当前实现中通过将保留计数设置为INT_MAX来实现,INT_MAX被视为特殊值,意思是“在释放时不减少我”。

答案 2 :(得分:2)

带格式的字符串是一种自动释放字符串的便捷方法,因此在这种情况下,您可能会向已经解除分配的对象发送释放消息。

在第二个示例中,您将静态创建字符串,因此保留计数不适用。

答案 3 :(得分:0)

在这两种情况下,您都不需要释放对象。

根据经验,如果您没有使用init(或initWithFoo:)来创建对象,并且没有故意使用retain来保留对象(另外其他一些罕见的情况),您不需要使用release