2011-08-25 6 views
1

J'ai été bloqué sur le problème des fuites de mémoire dans mon application iPhone pour un bon moment maintenant. Je me sens comme si je devais lire mes données incorrectes. il semble que chaque fois que j'alloue de la mémoire, il y a tellement de surcharge qui cause des fuites que lorsque je libère les données, mon utilisation de la mémoire diminue à peine ou ne baisse pas du tout. J'ai perdu 2 jours sur est mon UIWebview sur mon contrôleur flipside charge une url et l'utilisation de la mémoire de mon application saute de 3 mb à 7. Je libère le webview dans ma méthode dealloc mais l'énorme bloc de mémoire est toujours vivant. Quelqu'un a-t'il des suggestions.iPhone fuites de mémoire ridicule

- (void)viewDidLoad { 
self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 

nav_bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width+20,45)]; 
[self.view addSubview:nav_bar]; 
[UINavigationBar release]; 

rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(done)]; 
item = [[UINavigationItem alloc] initWithTitle:@"Flipside View"]; 
item.rightBarButtonItem = rightButton; 
item.hidesBackButton = YES; 
[nav_bar pushNavigationItem:item animated:NO]; 
[rightButton release]; 
[item release]; 

NSAutoreleasePool *initPool = [[NSAutoreleasePool alloc] init]; 

web_view = [[UIWebView alloc]initWithFrame:CGRectMake(0,45,self.view.frame.size.width,self.view.frame.size.height - 45)]; 

web_view.autoresizesSubviews = YES; 
web_view.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth); 

NSString *urlAddress = @"http://www.tutorialpark.com/wpcontent/uploads/3/HeartBlending.jpg"; 
NSURL *url = [NSURL URLWithString:urlAddress]; 
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

[web_view loadRequest:requestObj]; 
[self.view addSubview:web_view]; 
[web_view release]; 
[initPool release]; 

[super viewDidLoad]; 
} 

- (void)dealloc { 
    [nav_bar removeFromSuperview]; 
    [web_view removeFromSuperview]; 
    [rightButton release]; 
    [super dealloc]; 
} 

je présenter des excuses au sujet de l'empreinte que je suis très énervée en ce moment et ne veulent pas y faire face.

+0

BTW, je vois ces fuites tant dans le simulateur et le dispositif réel – Daniel

Répondre

1

[version UINavigationBar]; - Qu'est-ce que ça fait? Est-ce censé être [release nav_bar]? - Si c'est le cas, cela devrait être fait plus tard car un peu plus bas dans le code, vous accédez à nouveau à nav_bar. Mais alors, il semble être une variable membre? Donc, il devrait être publié dans dealloc. RightButton est publié deux fois - Une fois dans viewDidLoad et une fois dans dealloc.

Pouvez-vous expliquer à quoi sert le pool de publication automatique?

+0

la piscine autorelease reste plus d'un vieux morceau de code que je dois avoir jeté un regard sur elle quand je posté – Daniel

2

Vous semblez être confus sur le fonctionnement du comptage de référence.

Voir les commentaires ci-dessous:

- (void)viewDidLoad { 
    self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 

    UINavigationBar* nav_bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width+20,45)]; 
    // nav_bar retaincount 1 
    [self.view addSubview:nav_bar]; 
    // nav_bar retaincount 2 
    [nav_bar release]; 
    // nav_bar retaincount 1 - now controlled by self.view 

    UIBarButtonItem* rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(done)]; 
    // rightButton retaincount 1 

    UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:@"Flipside View"]; 
    // item retaincount 1 

    item.rightBarButtonItem = rightButton; 
    // rightButton retaincount 2 

    [rightButton release]; 
    // rightButton retaincount 1 - now controlled by item 

    item.hidesBackButton = YES; 
    [nav_bar pushNavigationItem:item animated:NO]; 
    // item retaincount 2 

    [item release]; 
    // item retaincount 1 - now controlled by nav_bar 

    UIWebView* web_view = [[UIWebView alloc]initWithFrame:CGRectMake(0,45,self.view.frame.size.width,self.view.frame.size.height - 45)]; 
    // web_view retaincount 1 

    web_view.autoresizesSubviews = YES; 
    web_view.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth); 

    NSString *urlAddress = @"http://www.tutorialpark.com/wpcontent/uploads/3/HeartBlending.jpg"; 

    NSURL *url = [NSURL URLWithString:urlAddress]; 
    // url is autoreleased, you can ignore.. 

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
    // requestObj is autoreleased, you can ignore.. 

    [web_view loadRequest:requestObj]; 

    [self.view addSubview:web_view]; 
    // web_view retaincount 2 

    [web_view release]; 
    // web_view retaincount 1 - now controlled by self.view 

    [super viewDidLoad]; 
} 

- (void)dealloc { 
    // don't need to do anything because all the memory is controlled by self.view, will be released when the internal variable self.view is released. 
    [super dealloc]; 
} 
+0

merci cela a définitivement éclairci certaines choses pour moi mais les données chargées par le webview existe toujours après que je rejette la vue filpside. C'est sympa car il n'a pas besoin de recharger l'url mais je veux qu'il ne soit plus mis en cache dans la mémoire. Existe-t-il un moyen de libérer les données chargées dans le webview, je pense que cela serait fait par le webview désallouer, mais selon mon graphique d'allocations pratique, il ne l'est pas. – Daniel

+0

Il est préférable de considérer les comptes de retenue comme un delta; vous ajoutez et soustrayez le nombre de retenue. Dans ce qui précède, les commentaires sont très probablement incorrects - le nombre de retenues peut être 2, il peut être 5, il peut être 492, l'important est que * cela n'a pas d'importance *. Vous devriez seulement vous inquiéter des retenues que vous causez. – bbum

+0

Il est vrai que le dénombrement peut être n'importe quoi, mais il était plus destiné à être un guide mental grossier à l'endroit où le dénombrement changerait et où se produit approximativement le transfert de la propriété. –