这是我的代码:
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/