如果我在下面的示例中释放mainPath,程序会出错(因为我发布了一个零计数器的对象)
NSString *mainPath = [NSString stringWithFormat:@"%@/Documents/downloadFile.plist",NSHomeDirectory()];
NSLog(@"address is = %@",mainPath);
[mainPath release]; //Program failed here
但是下面的代码工作正常。
NSString *aa=@"hiiiii";
[aa release];
任何人都能解释一下吗?
实际上我并不清楚指针的概念(给出一个合适的链接来清除它)
答案 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
。