objective-c - 关于autorelease/release和【池释放】

标签 objective-c memory-management nsautoreleasepool

这是我的代码:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string = [[NSString alloc] initWithFormat:@"s"];

[string autorelease];
NSLog(@"retainCount of string is %d", [string retainCount]);

[pool release];
NSLog(@"retainCount of string is %d", [string retainCount]);

当我尝试理解自动释放和释放时,我很困惑。 如果使用[string autorelease],向池发送释放消息后,string的retainCount仍然是1。但是使用[string release]替换[string autorelease],最终string的retainCount将是0。我对autorelease的了解是“通过发送自动释放消息将对象添加到当前自动释放池以供以后释放”。为什么我向它发送了一条自动释放消息并释放了池,我仍然可以访问该对象。

最佳答案

事情是这样的:retainCount 是一个实现细节。您永远不能依赖它作为任何特定值。您真正需要考虑的是您是否拥有某个对象。

分配字符串后,您就拥有它了。当您自动释放该字符串时,您不再拥有它,并且当您耗尽/释放自动释放池时它可能会消失。如果没有其他人拥有它,那么当您释放自动释放池时,它就会消失。无论如何,在释放自动释放池后,您将无法合法地发送字符串消息。

在当前实现中,创建字符串时保留计数为 1。自动释放不会更改保留计数。释放池时,release 会发送到其中的所有对象,其中包括您的字符串。发布中的代码如下所示:

if (retainCount == 1)
{
    [self dealloc];
}
else
{
    retainCount--;
}

因此您可以看到保留计数永远不会降至零。你的最终 NSLog 可以工作,因为字符串使用的内存尚未被回收。

关于objective-c - 关于autorelease/release和【池释放】,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9972922/

相关文章:

objective-c - 更改 -observeValueForKeyPath :ofObject:change:context: 中的属性时,Cocoa 绑定(bind)不起作用

iphone - Objective C iPhone 中的全局变量

memory-management - Intel x86-64 CPU 访问多少页表来转换虚拟内存?

iphone - 为什么 Instruments 在此代码中报告内存泄漏?

c - 结构成员如何在内存中分配?

ios - 无法获取权限提示

objective-c - 如何让对象在整个应用程序中保持事件状态?

iphone - 使用 NSOperationQueue 并尝试更改 slider /选择器等时,iPhone 设备上遇到大量泄漏

ios - 如何测试一个对象在拆卸后是否会被释放

ios - -retainCount 究竟有多不可靠?