gpt4 book ai didi

objective-c - 为什么要使用 NSAutoreleasePool?

转载 作者:太空狗 更新时间:2023-10-30 03:25:32 26 4
gpt4 key购买 nike

考虑以下程序:

int main (int argc, const char * argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Insert code here...
NSLog(@"Programming is Fun !");
[pool drain];
return 0;
}

我不明白为什么那里需要pool,因为同样的程序也可以这样写:

int main (int argc, const char * argv[]) { 
NSLog(@"Programming is Fun !");
return 0;
}

使用自动释放池的目的是什么?我们为什么以及什么时候需要它们?它们在每个 Objective C 程序中都是强制性的吗?

如果我不想自动释放任何对象,是否还需要使用自动释放池?

最佳答案

NSObject 包含一个名为 autorelease 的简洁函数。这意味着 Objective-C 中的所有对象都包含此函数。

此函数将self 插入到自动释放池中,延迟调用对象的release 函数,直到自动释放池被释放。大多数内部 API 使用一个自动释放池,除了位于 main() 中的那个之外,还有一个在 UIKit 的主循环中分配和释放的。

简而言之:它是引用计数器延迟递减的队列。

隐藏自动释放的示例:

[NSString stringWithUTF8String:"some string"];

此对象已分配,并在其上调用了自动释放。您自己会如何使用它?

MyObject *obj = [[[MyClass alloc] init] autorelease];

为什么这么好?当您返回此对象时,调用函数无需注意释放此对象,并且可以选择保留它(但不是必须)。


四年后扩展和澄清:

虽然 UIKit 和 AppKit 在它们的主运行循环过程中创建和释放 NSAutoreleasePool,但在您的非 GUI 程序中,您需要自己创建它。各种代码都希望有一个 NSAutoreleasePool 存在,并且由于您没有初始化 GUI 框架也没有使用它,所以没有代码可以神奇地为您创建它。

虽然 NSLog() 和常量 NSString 在您的示例中不需要池,但即使是普通的 [NSMutableArray array] 也需要,因为它实际上可以解释为 [[[NSMutableArray alloc] init] autorelease]

关于objective-c - 为什么要使用 NSAutoreleasePool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com