iphone - 未显式调用 Objective-C 版本

标签 iphone objective-c cocoa ios

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/

相关文章:

iphone - Aviary SDK 问题

ios - 用换行符替换多个空格,但保留单个空格

objective-c - 具有合理反馈的原子、异步 HTTP 文件 POST?

iphone - 如何在 iOS 中计算对数?

iphone - iOS初始化UIWebView清除导航历史记录

html - NSAttributedString 的 initWithHTML 的默认 DPI 是多少?

iphone - 如何在 UIButton 之间以编程方式获取 NSLayoutConstraint?

iphone - 我们如何从 url 下载 sqlite 数据库并将其作为 sqlite 数据库添加到我们的应用程序中?

javascript - 如果需要,应用程序可以对 ipod 进行超频吗?

iphone - 检查哪个请求来自 NSURLConnection 委托(delegate)