NSAutoreleaseNoPool在做NSLog - Mac App开发时

时间:2011-02-22 06:52:30

标签: cocoa macos console nslog

我在Xcode中尝试了一个程序,并且我创建了一个新的Mac Cocoa应用程序。我有一个名为Photo的类,有两个实例变量Caption,Photographer。在main函数中,我按如下方式为它们提供值。

Photo *obj = [[Photo alloc]init];
obj.caption=@"Something";
obj.photographer=@"Hari";
NSLog(@"Name: '%@'",[obj caption]);
[obj release];

我得到名为Name:'Something'的输出,但随之而来的是我得到这一行

2011-02-22 11:56:03 test_1[1402:a0f] * __NSAutoreleaseNoPool(): Object 0x100002078 of class NSCFString autoreleased with no pool in place - just leaking

有人可以解释为什么这条线出现在控制台中?

谢谢,

哈里哈兰

1 个答案:

答案 0 :(得分:0)

Cocoa使用autorelease pools。自动释放池保留对已自动释放的对象的引用,并且当池耗尽时,它会向这些自动释放的对象发送-release消息。

在绝大多数情况下,Cocoa应用程序应该至少有一个自动释放池,因为Cocoa大量使用自动释放的对象。运行Cocoa应用程序时,Cocoa会自动为应用程序创建自动释放池。

在您的情况下,您的应用程序似乎是一个Foundation程序而不是一个完整的Cocoa应用程序。因此,您有责任为您的程序设置自动释放池。例如,

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Photo *obj = [[Photo alloc] init];
    // …

    [pool drain];
    return 0;
}

请注意,自动释放池不是必需的。如果没有自动释放池,您的程序将输出该警告,并且根据程序的具体情况,您可能会泄漏对象。由于泄漏内存是程序中的一个不好的功能,特别是在分配大量内存的长期程序或程序中,建议始终设置自动释放池。

那就是说,你没有在那段代码中发送-autorelease,那为什么会有一个自动释放的字符串呢?我假设您已经合成了caption属性,并且编译器创建了一个访问器方法,该方法返回包含照片标题的自动释放字符串。发送[obj caption]时,会收到一个自动释放的字符串,因此您没有设置自动释放池,因此会出现警告。