gpt4 book ai didi

cocoa - NSAutorelease 内存泄漏

转载 作者:行者123 更新时间:2023-12-03 16:49:01 25 4
gpt4 key购买 nike

我在控制台中收到此错误消息:

*** _NSAutoreleaseNoPool(): Object 0x10d2e0 of class NSPathStore2    autoreleased with no pool in place - just leaking

我不知道错误是什么?

谢谢。

最佳答案

这是一个经典的内存管理问题,您在没有自动释放池的情况下自动释放了一些对象。自动释放并不是魔法。有一个 NSAutoreleasePool 类型的对象,它跟踪您自动释放的所有对象,并“不时”释放它们:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// An autoreleased object referenced by our pool.
id object = [NSNumber numberWithInt:1];
[pool drain];
// Our object no longer valid.

每个线程都必须有自己的自动释放池。这是非常合乎逻辑的,因为线程“同时”运行,并且如果它们共享一个公共(public)自动释放池,则它可以在您仍在使用对象时释放该对象。

现在是重点。每个应用程序的主线程中都有一个默认的自动释放池,这意味着您不必考虑所有这些,并且自动释放的对象会被很好地收集。但是,如果您创建另一个线程,通常还被迫为此线程创建一个自动释放池。否则没有人可以声明自动释放的对象,它们就会泄漏。这正是您收到警告的原因。

没有自动释放池的泄漏线程可能如下所示:

- (void) doSomethingInBackground
{
id object = [NSNumber numberWithInt:1];
}

- (void) someOtherMethod
{
[self performSelectorInBackground:@selector(doSomethingInBackground);
}

修复很简单:

- (void) doSomethingInBackground
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id object = [NSNumber numberWithInt:1];
[pool drain];
}

现在您只需弄清楚在另一个线程中运行代码的位置即可。

关于cocoa - NSAutorelease 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599756/

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