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

Mar*_*tin 8 objective-c

我通过在一个简单的命令行程序中使用一些代码来学习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;
}
Run Code Online (Sandbox Code Playgroud)

我编译并运行它像这样:

gcc test.m -o test -ObjC -framework Foundation
./test
Run Code Online (Sandbox Code Playgroud)

并获得以下输出:

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
Run Code Online (Sandbox Code Playgroud)

所以我可以看到错误是指没有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;
}
Run Code Online (Sandbox Code Playgroud)

因此,我正确地假设使用NSString等对象并针对Foundation编译的命令行应用程序需要手动创建自动释放池吗?我的榜样是最好的方式吗?

注意:我也试过[你好发布]; 没有NSAutoreleasePool,看看我是否可以在不使用池的情况下手动清理内存,但是遇到了同样的问题.

Ben*_*tto 9

是的,是的.

Cocoa(在GUI或Foundation表单中)期望存在自动释放池; 框架(不仅仅是你自己的代码)的内部自由使用的的-autorelease消息和池,如果你不具备自动释放池栈上的任何池,它会抱怨,和泄漏的对象,因为你"见过.

我认为你关掉了垃圾收集; 我从未开发过它,但在那种情况下,我可以想象你不需要这个.

现在可以使用@autoreleasepool {...}具有相同效果的块创建更新自动释放池,以及一些很好的奖励,例如能够跳出/退出它.