J'utilisais l'outil "Allocations" d'Apple et j'ai remarqué que lorsque je passais d'une vue à l'autre, l'allocation augmentait toujours. En enquêtant, j'ai découvert que toute la mémoire provient d'objets qui sont des sous-vues de UIView de mon UIViewController.UIViewController est correctement désalloué mais son UIView n'est pas?
J'ai vérifié et mon UIViewController est libéré, mais apparemment le UIView n'est pas? Je ne retiens pas le UIView du contrôleur UIView. Quelqu'un a des idées?
Voici le code que j'ai écrit pour passer d'une vue à l'autre.
UISubViewController *viewController = [UIViewControllerFactory createViewController:viewControllerID]; // Creates and returns a UIViewController by ID
[currentViewController viewWillDisappear:YES];
[currentViewController.view removeFromSuperview];
[currentViewController viewDidDisappear:YES];
[viewController viewWillAppear:YES];
[self.view insertSubview:viewController.view atIndex:0];
[viewController viewDidAppear:YES];
self.currentViewController = viewController;
[viewController release];
Edit:
Ok, parce qu'il craignait que je juste en utilisant la vue d'un ViewController puis en relâchant le ViewController, j'ai essayé une expérience où j'ai fait une nouvelle classe qui est propriétaire du fichier dans le NIB, mais hérite de NSObject.
le code ressemble maintenant à ceci:
MyView *myView = [[MyView alloc] initWithNibName:@"myView"];
[currentView viewWillDisappear:YES];
[currentView.view removeFromSuperview];
[currentView viewDidDisappear:YES];
[myView viewWillAppear:YES];
[self.view insertSubview:myView.view atIndex:0];
[myView viewDidAppear:YES];
self.currentView = myView;
[myView release];
de initialiseur de MyView ressemble:
@interface MyView : NSObject {
IBOutlet UIView *view;
NSArray *nibTopLevelObjects;
}
@property (nonatomic, retain) UIView *view;
- (id)initWithNibName:(NSString *)nibName;
@end
@implementation MyView
@synthesize view;
- (id)initWithNibName:(NSString *)nibName {
if (self = [super init]) {
nibTopLevelObjects = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
[nibTopLevelObjects retain];
}
return self;
}
- (void)dealloc {
[view release];
[nibTopLevelObjects release];
view = nil;
nibTopLevelObjects = nil;
[super dealloc];
}
@end
Je vois encore la fuite de mémoire de la vue à chaque fois que j'échange et de nouvelles vues.
De nouvelles idées?
Qu'est-ce que UIViewControllerFactory, et comment crée-t-il les vues? A partir de fichiers nib? – GendoIkari
Oui, UIViewControllerFactory mappe simplement viewControllerID avec la chaîne correcte pour initWithNibName, puis renvoie le viewController. – PyongHopscotch