【问题标题】:Odd CoreData Memory Leaks奇怪的 CoreData 内存泄漏
【发布时间】:2012-03-07 09:19:02
【问题描述】:

在 Instruments 中最终测试我的应用程序是否泄漏时,我遇到了 2 个奇怪的泄漏:

泄漏对象:_PFArray,#:1 地址:0x2a11c0 大小:32 字节负责库:CoreData 负责帧:newFetchedRowsForFetchPlan_MT

还有

泄漏对象:Malloc 16 字节,#:1 地址:0x24d6b0 大小:16 字节负责库:CoreData 负责帧:newFetchedRowsForFetchPlan_MT

两个泄漏的堆栈跟踪都指向:

records = [[self.managedObjectContext executeFetchRequest:request error:&error] retain];

在 CoreData Fetch 中。

还有

[self.window makeKeyAndVisible];

这些泄漏是什么?我以前从未见过他们。当我构建和分析时,它们不会弹出。有人有什么建议吗?

谢谢!!

编辑:

这里是围绕记录数组的代码。 Records 只是在 .h 中声明的 NSarray。

  /*
 Fetch existing events.
 Create a fetch request; find the Event entity and assign it to the request; add a sort descriptor; then execute the fetch.
 */
marblebeingdragged=YES;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Child" inManagedObjectContext:_managedObjectContext];
[request setEntity:entity];

// Order the events by creation date, most recent first.
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSSortDescriptor *prizeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"prize" ascending:NO];
NSSortDescriptor *neededDescriptor = [[NSSortDescriptor alloc] initWithKey:@"marblesneeded" ascending:NO];
NSSortDescriptor *colorDescriptor = [[NSSortDescriptor alloc] initWithKey:@"color" ascending:NO];
NSSortDescriptor *reachedDiscriptor = [[NSSortDescriptor alloc] initWithKey:@"prizereached" ascending:NO];



NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:nameDescriptor,prizeDescriptor,neededDescriptor,colorDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[nameDescriptor release];
[colorDescriptor release];
[prizeDescriptor release];
[neededDescriptor release];
[reachedDiscriptor release];
[sortDescriptors release];

// Execute the fetch -- create a copy of the result.
NSError *error = nil;
records = [[self.managedObjectContext executeFetchRequest:request error:&error] retain];

【问题讨论】:

  • 完成后是否释放保留?
  • @whitelionV 我在 MainViewController 的 dealloc 方法中释放记录。
  • 我认为你不必retain获取的结果。

标签: iphone objective-c ios core-data memory-leaks


【解决方案1】:

您需要释放“记录”对象。并且您需要在完成使用后释放它,而不是在 dealloc 方法中。发布更多您的代码。你是如何定义记录的?如果您需要任何帮助,请发布整个核心数据代码块。

records = [[self.managedObjectContext executeFetchRequest:request error:&error] retain];
//.... code using records
[records release];

编辑:

要么用这个

records = [[self.managedObjectContext executeFetchRequest:request error:&error]]; // no retian

或者这个

records = [[[self.managedObjectContext executeFetchRequest:request error:&error] retain] autorelease];

【讨论】:

  • 我已经添加了整个代码块。此外,在我的整个应用程序中,记录数组被编辑并保存到核心数据中。只有在视图关闭时才应该释放它。谢谢
  • 不,我对记录对象感兴趣。它是 .h 文件中的保留属性吗?那是你分配的第一个地方吗?无论如何尝试在最后添加自动释放并查看。它应该可以解决问题,因为我无法查看代码的相关部分。或者删除保留并尝试 self.records = [[self.managed ...
  • 记录数组声明如下:@property(strong, nonatomic) NSArray *records;
  • 当您询问有关内存泄漏的问题时,您没有提及您正在使用 ARC!
  • 我没有使用 ARC。当切换强保留时,会出现相同的泄漏。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 2015-05-09
  • 2021-03-28
  • 2020-12-19
  • 2011-04-01
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多