0

当我运行我的应用程序输出时,我会看到很多这样的字符串:

2012-05-12 14:41:52.542 PermTour[1688:15c0b] *** __NSAutoreleaseNoPool(): Object 0x5c39520 of class NSCFString autoreleased with no pool in place - just leaking

而且我知道这部分代码中的问题。因为,当我评论它时,输出是空的。

 for(int i=0;i<[dataBase.allDataBase count];i++){
        aPLace = [dataBase.allDataBase objectAtIndex:i];
        name = [aPLace.name lowercaseString];
        description = [aPLace.description lowercaseString];
        if (!([name rangeOfString:searchText].location == NSNotFound) || !([description rangeOfString:searchText].location == NSNotFound)){
            [foundedPlaces addObject:aPLace];
        }

    }

有任何想法吗?谢谢

UPD。

当我评论所有代码时,它看起来像:

for(int i=0;i<[dataBase.allDataBase count];i++){
        aPLace = [dataBase.allDataBase objectAtIndex:i];
        name = [aPLace.name lowercaseString];
        //description = [aPLace.description lowercaseString];
        /*
        if (!([name rangeOfString:searchText].location == NSNotFound) || !([description rangeOfString:searchText].location == NSNotFound)){
            [foundedPlaces addObject:aPLace];
        }
         */

    }

仍然内存泄漏.. 那么你现在想写什么?

更新 2 在此处输入图像描述

4

2 回答 2

2

当您处理大量数据(内存)时,最好使用NSAutoreleasePool.

编辑 -

-(returnType)yourMethod:(returnType)parameter @autoreleasepool
{
    @autoreleasepool
    {
         //method body.
    }
}

希望这会帮助你。

于 2012-05-12T09:10:34.797 回答
1

我已经看到这个错误消息是类初始化方法(例如+initialize+load或其他自定义方法)。

我的解决方案是简单地创建一个自动释放池,如下所示:

@autoreleasepool
{
     initThis();
     [That init];
}

@autoreleasepool关键字可用于具有相似语义的 ARC 和非 ARC 项目。

这是关于此事的小字:

NSApplication 类在初始化期间和事件循环内部——特别是在其初始化(或 sharedApplication)和运行方法中设置自动释放池(NSAutoreleasePool 类的实例)。类似地,Application Kit 添加到 NSBundle 的方法在加载 nib 文件期间使用自动释放池。这些自动释放池不能在各自的 NSApplication 和 NSBundle 方法的范围之外访问。通常,应用程序要么在事件循环运行时创建对象,要么通过从 ni​​b 文件加载对象来创建对象,因此这种缺乏访问权限通常不是问题。但是,如果您确实需要在 main() 函数本身中使用 Cocoa 类(除了加载 nib 文件或实例化 NSApplication),您应该在使用这些类之前创建一个自动释放池,然后在完成后释放该池. 有关更多信息,请参阅 Foundation Framework Reference 中的 NSAutoreleasePool。

于 2012-05-12T09:19:54.283 回答