这是我的代码:
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],则在向池发送释放消息后,字符串的retainCount仍然为1。但使用[string release]来代替[string autorelease],最终retainCount的字符串将为0。关于autorelease,我所知道的是"通过向当前的自动发布池发送一条自动发布消息,将一个对象添加到该池中以备将来发布"。为什么我向它发送了一条自动释放消息并释放池,我仍然可以访问该对象。
事情是这样的:retainCount
是一个实现细节。你永远不能指望它有任何特定的价值。你真正需要考虑的是你是否拥有一件物品。
分配字符串后,你就拥有它。当你自动释放字符串时,你就不再拥有它,当你耗尽/释放自动释放池时,它可能会消失。如果没有其他人拥有它,当您释放自动释放池时,它将消失。无论如何,在您释放了自动释放池之后,您不能合法地发送字符串消息。
在当前实现中,创建的字符串的保留计数为1。自动释放不会更改保留计数。释放池时,release
将发送到池中的所有对象,其中包括您的字符串。发布中的代码看起来像这样:
if (retainCount == 1)
{
[self dealloc];
}
else
{
retainCount--;
}
所以你可以看到保留计数永远不会降到零。由于字符串使用的内存尚未回收,因此最终的NSLog可以正常工作。
您必须使用[pool drain]而不是释放消息来释放池中所有自动释放的对象。此消息将为您调用[池释放]。