首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在进行NSLog - Mac App开发时使用NSAutoreleaseNoPool

在进行NSLog - Mac App开发时使用NSAutoreleaseNoPool
EN

Stack Overflow用户
提问于 2011-02-22 14:52:30
回答 1查看 206关注 0票数 0

我正在尝试一个用Xcode编写的程序,我已经创建了一个新的Mac Cocoa应用程序。我有一个名为Photo的类,它有两个实例变量Caption,Photo。在main函数中,我为它们提供了如下值。

代码语言:javascript
复制
Photo *obj = [[Photo alloc]init];
obj.caption=@"Something";
obj.photographer=@"Hari";
NSLog(@"Name: '%@'",[obj caption]);
[obj release];

我得到了名为Name:'Something‘的输出,但同时我得到了下面这一行

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

有人能解释一下为什么这行会出现在控制台上吗?

谢谢,

哈里哈兰语

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-22 15:17:31

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

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

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

代码语言:javascript
复制
int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

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

    [pool drain];
    return 0;
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5074997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档