NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString * str = [[NSString alloc] initWithString:@"test"];
[str release];
int i = 999999999;
while(i-- > 0) {}
NSLog(@"%@", str);
[pool drain];
输出:测试
为什么 release
不起作用?
如何立即从内存中删除对象?
Xcode 版本 4.0 iPhone 应用程序
~已解决~
感谢大家的回答。 我有很多关于这个问题的有用信息。我将使用 NSString *str = @"text"而不是 NSString *str = [[NSString alloc] initWithString:@"text"];
我明白释放只是将内存“标记”为“愿意释放”,但不会立即释放它
最佳答案
确实有效。您已经放弃了该对象的所有权,当系统确定它不再拥有时,它将被标记为可供系统重用。如果您是该字符串的唯一所有者,那可能会立即发生。如果字符串的创建导致它在内部自动释放,它可能会在稍后发生。或者,正如 Dave DeLong 指出的那样,系统可能会将其优化为一个永远不会释放的对象。
在您的例子中,它被优化为一个常量字符串,它将在程序的整个生命周期中存在。如果您要使用 NSMutableString
而不是 NSString
,您会看到可能不会崩溃但不会打印出您所期望的奇怪行为。 (有关示例,请参见 this question。)
如果您改为使用 NSArray
,它会在您调用 release
时被释放,但您仍然会看到您的 NSLog 示例工作正确直到你分配了一些其他的对象。释放只是将内存标记为可重用;它实际上并没有清除它。因此,如果您将数组传递给 NSLog,则该内存没有更改,因此它仍然可以正确打印。
不过,所有这一切的关键点是要认识到调用 release
不一定会导致对象被释放。由于多种原因,它可能会继续存在。但是一旦调用 release
,您就放弃了对象的所有权。如果在那之后你继续使用它,系统可以按照自己的意愿自由地做各种奇怪的事情,正如所证明的那样。
关于iphone - 未显式调用 Objective-C 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636551/