2010-09-10 11 views
0

J'ai les codes suivants, qui ont des fuites de mémoire sur l'appareil, pourriez-vous nous aider à le vérifier? Merci.self.tableView.delegate = self et self.table.dataSource = fuite auto-mémoire

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

[self fetch];

} 

- (void)fetch { 

NSErreur * erreur = nil; BOOL success = [self.fetchedResultsController performFetch: erreur &]; if (! Success) { debugLog (@ "Erreur non gérée lors de l'exécution de fetch:% @", [erreur localiséeDescription]); NSAssert1 (0, @ "Erreur non gérée lors de l'exécution de l'extraction:% @", [erreur localiséeDescription]); } [tableView reloadData];

} 

- (NSFetchedResultsController *)fetchedResultsController { 

si (fetchedResultsController == nil) { NSFetchRequest * fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; DemoAppDelegate * appDelegate = (DemoAppDelegate *) [UIApplication sharedApplication] .delegate; [fetchRequest setEntity: [NSEntityDescription entityForName: @ "Nouvelles" inManagedObjectContext: appDelegate.managedObjectContext]];

fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: appDelegate.managedObjectContext sectionNameKeyPath: néant cacheName: @ "NewsCache"];

} 

return fetchedResultsController; }

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

DemoAppDelegate * appDelegate = (DemoAppDelegate *) [UIApplication sharedApplication] .delegate; [appDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification: aNotification]; [auto-fetch]; }

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

    News *news = [fetchedResultsController objectAtIndexPath:indexPath]; 

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

} 

@end 
+1

Qu'est-ce qui vous fait penser que cela fuit? Nous avons besoin de plus de code et d'infos sur les objets qui ont fui. – Eiko

Répondre

1

Il est peu probable que la mise en astronomiquement la propriété délégué ou dataSource d'une instance UITableView pourrait provoquer une fuite de mémoire sensible.

Vous devriez examiner votre code environnant de manière plus approfondie.

+1

@Eiko, Ryan, merci pour votre réponse, j'ai ajouté plus de code de détail, j'ai utilisé des données de base pour fournir des données pour la cellule dans tableView, je ne sais pas pourquoi la fuite s'est produite. Pourriez-vous s'il vous plaît aider à vérifier? Merci d'avance! – mobguang

+0

Plus de code est bon, mais il n'y a toujours pas assez. Vous libérez et retenez tout de manière appropriée. Comme Eiko l'a demandé précédemment: qu'est-ce qui vous fait penser que cela fuit? Avez-vous utilisé des instruments pour le vérifier? – Ryan

+0

oui, l'instrument indique qu'il y a une fuite. Mais la lib responsable est UIKit au lieu de mon application, puis-je l'ignorer? Merci. – mobguang