0

我正在 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

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

谢谢,

哈里哈兰

4

1 回答 1

0

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

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

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

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

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

    [pool drain];
    return 0;
}

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

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

于 2011-02-22T07:17:31.103 回答