Утечка памяти с NSFetchedResultsController objectAtIndex - PullRequest
1 голос
/ 10 июля 2010

У меня утечка памяти при использовании NSFetchedResultsController objectAtIndex: фрейм стека выглядит следующим образом:

   0 CoreFoundation __CFDataAllocate
   1 CoreFoundation __CFDataInit
   2 CoreData -[NSSQLCore _prepareResultsFromResultSet:usingFetchPlan:withMatchingRows:]
   3 CoreData -[NSSQLCore _newRowsForFetchPlan:selectedBy:withArgument:]
   4 CoreData -[NSSQLCore newRowsForFetchPlan:]
   5 CoreData -[NSSQLCore objectsForFetchRequest:inContext:]
   6 CoreData -[NSSQLCore executeRequest:withContext:error:]
   7 CoreData -[NSPersistentStoreCoordinator executeRequest:withContext:error:]
   8 CoreData -[NSManagedObjectContext executeFetchRequest:error:]
   9 CoreData _faultBatchAtIndex
  10 CoreData -[_PFBatchFaultingArray objectAtIndex:]
  --->  11 MyApp -[DocumentViewController tableView:heightForRowAtIndexPath:] 
  12 UIKit -[UISectionRowData refreshWithSection:tableView:tableViewRowData:]
  13 UIKit -[UITableViewRowData rectForFooterInSection:]
  14 UIKit -[UITableViewRowData heightForTable]
  15 UIKit -[UITableView(_UITableViewPrivate) _updateContentSize]
  16 UIKit -[UITableView noteNumberOfRowsChanged]
  17 UIKit -[UITableView reloadData]
  18 UIKit -[UITableView layoutSubviews]
  19 QuartzCore -[CALayer layoutSublayers]
  20 QuartzCore CALayerLayoutIfNeeded
  21 QuartzCore CA::Context::commit_transaction(CA::Transaction*)
  22 QuartzCore CA::Transaction::commit()
  23 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)
  24 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
  25 CoreFoundation __CFRunLoopDoObservers
  26 CoreFoundation __CFRunLoopRun
  27 CoreFoundation CFRunLoopRunSpecific
  28 CoreFoundation CFRunLoopRunInMode
  29 GraphicsServices GSEventRunModal
  30 GraphicsServices GSEventRun
  31 UIKit UIApplicationMain

Из этого фрейма стека выглядит, как объект, доступ к которому осуществляется с помощью objectAtIndex, пропускается.

Однако, когда я покидаю контроллер, вызывается его метод dealloc.В этом методе все объекты, выбранные контроллером fetchedresults, превращаются в ошибки, поскольку я использую [NSManagedObjectContext refreshObject: mergeChange].

Чтобы быть полным в моем описании, ниже приведен код, где создается утечка объекта:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Page* page = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    UIImage* thumbnail = [page getThumbnail];
    [[self managedObjectContext] refreshObject:page.image mergeChanges:NO];
    CGFloat height = [PageCell cellImageSize:thumbnail].height + 20;
    return height;
}

Любая подсказка будет оценена, спасибо!

Ответы [ 2 ]

1 голос
/ 10 июля 2010

Проверьте код, где вы получите UIImage. Утечка, скорее всего, там. Где это точно зависит от того, как вы создаете объект изображения.

1 голос
/ 10 июля 2010

Запрещено больше доказательств, что больше похоже на утечку в недрах Базовых Данных.Подайте ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...