iPhone:内存不足崩溃

标签 iphone memory-leaks crash

我再次在代码中寻找内存泄漏和其他疯狂错误。 :)

我有一个缓存,其中包含经常使用的文件(图像、数据记录等,其 TTL 约为 一周和大小有限的缓存 (100MB))。有时一个文件中有超过 15000 个文件 目录。应用程序退出时,缓存会使用当前缓存写入控制文件 大小以及其他有用的信息。如果应用程序由于某种原因崩溃 (嘘..有时会发生)在这种情况下,我必须计算应用程序启动时所有文件的大小,以确保我知道缓存大小。 由于内存不足,我的应用程序此时崩溃了,我不知道为什么。

内存泄漏检测器根本没有显示任何泄漏。我也没有看到。怎么了 用下面的代码?有没有其他快速方法来计算所有文件的总大小 在 iPhone 上的目录中?也许不需要枚举目录的全部内容? 代码在主线程上执行。

NSUInteger result = 0;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSDirectoryEnumerator *dirEnum = [[[NSFileManager defaultManager] enumeratorAtPath:path] retain];
int i = 0;
while ([dirEnum nextObject]) {
   NSDictionary *attributes = [dirEnum fileAttributes];
   NSNumber* fileSize = [attributes objectForKey:NSFileSize];
   result += [fileSize unsignedIntValue];

   if (++i % 500 == 0) { // I tried lower values too   
      [pool drain];
   }
}
[dirEnum release];
dirEnum = nil;
[pool release];
pool = nil;

谢谢, MacTouch

最佳答案

排空池子会“释放”它,而不仅仅是清空它。将自动释放池视为堆栈,因此您已经弹出了自己的对象,这意味着所有这些新对象都将进入主自动释放池,并且在弹出之前不会被清理。相反,请将自动释放池的创建移至循环内部。你可以做类似的事情

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
int i = 0;
while( shouldloop ) {
  // do stuff
  if( ++i%500 == 0 ) {
    [pool drain];
    pool = [[NSAutoreleasePool alloc] init];
  }
}
[pool drain];

关于iPhone:内存不足崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794571/

相关文章:

ios - 如何实现两周模式的日历 View (使用JTCalendar示例)

python - 为什么我不需要释放这个内存?

c++ - C++程序编译,运行但崩溃(无错误消息)

c++ - 是否存在使用 Purify 导致 SIGABRT 在 g++ 中抛出异常的已知问题?

flash - 打开Adobe Flash IDE,打开Windows资源管理器,崩溃

iphone - 可变列表参数

iphone - 如何从 .ipa 文件获取源代码?

ios - 为什么在使用 ARC 时此代码会导致 EXC_BAD_ACCESS?

php - 如何正确关闭 Doctrine 中的实体管理器

c++ - 内存泄漏,来源 : float** binsRowPtrs = new float *[_nbins];