self.tableView.delegate = self и self.table.dataSource = self утечка памяти - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть следующие коды, которые имеют утечку памяти на устройстве, не могли бы вы помочь проверить это? Спасибо.

@interface NewsListViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> {

@private
  UITableView *tableView;
  NSFetchedResultsController *fetchedResultsController;
......

}

@property (nonatomic, retain, readonly) NSFetchedResultsController *fetchedResultsController;

@end



@implementation NewsListViewController {

......

 - (void)dealloc {
    [fetchedResultsController release];
 fetchedResultsController = nil; 

    tableView.delegate = nil;
 tableView.dataSource = nil;
 [tableView release];
 tableView = nil;

    [super dealloc];
 }

 -(void)viewDidLoad {

......

  tableView.delegate = self;   // **leak here**

  tableView.dataSource = self; // **leak here**
  DemoAppDelegate *appDelegate = (DemoAppDelegate *)[UIApplication sharedApplication].delegate;
 [[NSNotificationCenter defaultCenter] addObserver:self
           selector:@selector(handleSaveNotification:)
         name:NSManagedObjectContextDidSaveNotification
          object:appDelegate.managedObjectContext];

[самостоятельная загрузка];

}

- (void)fetch {

NSError * error = nil; BOOL success = [self.fetchedResultsController executeFetch: & error]; if (! success) { debugLog (@ "Необработанная ошибка при выполнении выборки:% @", [error localizedDescription]); NSAssert1 (0, @ "Необработанная ошибка при выполнении выборки:% @", [error localizedDescription]); } [tableView reloadData];

}

 - (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController == nil) { NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init] autorelease];

DemoAppDelegate * appDelegate = (DemoAppDelegate *) [UIApplication sharedApplication] .delegate; [fetchRequest setEntity: [NSEntityDescription entityForName: @ "News" inManagedObjectContext: appDelegate.managedObjectContext]];

fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: appDelegate.managedObjectContext sectionNameKeyPath: ноль cacheName: @ "NewsCache"];

}

return fetchedResultsController; }

 - (void)handleSaveNotification:(NSNotification *)aNotification {

DemoAppDelegate * appDelegate = (DemoAppDelegate *) [UIApplication sharedApplication] .delegate; [appDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification: aNotification]; [самостоятельная загрузка]; }

 - (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    News *news = [fetchedResultsController objectAtIndexPath:indexPath];

    // fill cell.label.text according to the news field value

 }   

 @end

1 Ответ

1 голос
/ 10 сентября 2010

Астрономически маловероятно, что установка свойства делегата или dataSource экземпляра UITableView может вызвать заметную утечку памяти.

Вам следует более тщательно изучить окружающий код.

...