【问题标题】:Strange NSLog errors. Memory leaks奇怪的 NSLog 错误。内存泄漏
【发布时间】:2012-05-12 09:05:55
【问题描述】:

当我运行我的应用程序时,输出显示了很多这样的字符串:

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];
        }

    }

有什么想法吗?谢谢

更新。

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

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

【问题讨论】:

  • 这个方法是在后台线程调用的吗?

标签: ios xcode memory-leaks nslog


【解决方案1】:

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

编辑-

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

希望这会对你有所帮助。

【讨论】:

  • 你能解释一下我应该如何使用它吗?
  • XCode 说我不能在 ARC 中使用它
  • @EugeneTrapeznikov - 我已经检查了这一点并更新了我的代码以支持 ARC,希望最后这会对你有所帮助。
【解决方案2】:

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

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

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

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

关于此事的small print

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

【讨论】:

  • @EugeneTrapeznikov 对不起,我不明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2015-05-09
  • 2021-03-28
  • 2020-12-19
  • 2011-04-01
  • 2012-03-07
相关资源
最近更新 更多