gpt4 book ai didi

objective-c - Objective-C 命令行程序是否需要 NSAutoreleasePool?

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

我正在通过在一个简单的命令行程序中尝试一些代码来学习 Objective-C,这是我的代码:

#import <Foundation/Foundation.h>
#import <stdio.h>

int main(int argc, char** argv)
{
NSString *hello = @"hello world";

printf("msg: %s\n", [hello UTF8String]);

return 0;
}

我是这样编译运行的:

gcc test.m -o test -ObjC -framework Foundation
./test

得到如下输出:

2011-06-08 20:35:21.178 test[10220:903] *** __NSAutoreleaseNoPool(): Object 
0x10010c8b0 of class NSCFData autoreleased with no pool in place - just leaking
msg: hello world

所以我可以看到错误是指没有 NSAutoreleasePool 这一事实,当我添加一个时,错误消失了:

#import <Foundation/Foundation.h>
#import <stdio.h>

int main(int argc, char** argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *hello = @"hello world";

printf("msg: %s\n", [hello UTF8String]);

[pool release];

return 0;
}

所以我假设使用 NSString 等对象并针对 Foundation 进行编译的命令行应用程序需要手动创建自动释放池是正确的吗?我上面的例子是最好的方法吗?

注:我也试过[hello release];没有 NSAutoreleasePool 来查看我是否可以在不使用池的情况下手动清理内存,但遇到了同样的问题。

最佳答案

是的,是的。

Cocoa(以 GUI 或 Foundation 形式)期望存在一个自动释放池;框架的内部(不仅仅是你自己的代码)自由使用 -autorelease 消息和池,如果你在自动释放池堆栈上没有任何池,它会提示,并泄漏对象,如您所见。

我假设您关闭了垃圾收集;我从来没有用它开发过,但在那种情况下,我可以想象你不需要它。

更新 现在可以使用 @autoreleasepool {...} block 创建自动释放池,它具有相同的效果,还有一些不错的奖励,例如能够从中跳出/返回。

关于objective-c - Objective-C 命令行程序是否需要 NSAutoreleasePool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284326/

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