2011-05-04 4 views
1

J'ai essayé de résoudre ce problème. Fondamentalement, j'utilise la fonction UIColor RGB de commodité pour retourner un UIColor pour teindre mon UINavigationBar, UIToolbar et d'autres objets. Cependant, pour une raison quelconque dans Instruments, il continue à dire que j'ai une fuite de mémoire chaque fois que je charge un UIView. Toute aide serait appréciée. J'ai simplifié le code ici pour plus de clarté. Voici ma fonction (la fonction a le RVB et Alpha en tant que variables) qui est situé dans une classe mondiale singleton:UIColor Memory Leak Issue

- (UIColor *)returnSelectedColor{ 
    return [UIColor colorWithRed:(100)/255.0 green:(100)/255.0 blue:(100)/255.0 alpha:(1.0)]; 
} 

Dans mon RootViewController je mets cela dans le viewWillAppear (parfois teinte peut changer entre les deux appels mais je essayé ViewDidLoad mais le problème était toujours là). J'ai essayé deux approches différentes pour résoudre ce problème mais la fuite est toujours présente.

La première approche était de définir la teinte lorsque la vue apparaît comme ceci:

self.navigationController.navigationBar.tintColor=[[GlobalData sharedGlobalData] returnSelectedNavigationColor]; 

La deuxième approche était de créer une propriété UIColor pour la vue, réglez-le sur UIColor désiré, puis définissez la navigationbar Teinte à cette propriété, lorsque la vue se ferme, je libère la propriété. Cette approche provoque également une fuite de mémoire. Voici le code:

if(self.navigationToolbarColor!=nil){ 
     [self.navigationToolbarColor release]; 
    } 
    self.navigationToolbarColor=[[[GlobalData sharedGlobalData] returnSelectedNavigationColor] retain]; 

self.navigationController.navigationBar.tintColor=self.navigationToolbarColor; 

Quelqu'un a-t-il une idée de ce que pourrait être le problème? Merci d'avance.

Répondre

1

La question ici est que vous avez probablement navigationToolbarColor comme une propriété retenue, de sorte que vous avez plus de retenue sur cette ligne:

self.navigationToolbarColor=[[[GlobalData sharedGlobalData] returnSelectedNavigationColor] retain]; 

Débarrassez-vous de l'appel à retain là et vous devriez être tout bon .

+0

Merci pour la réponse. Cependant j'ai essayé cela mais j'ai toujours la même fuite de mémoire. La première approche que j'ai utilisée n'a pas de retenue (sans propriété) et donne une fuite de mémoire. J'ai essayé d'utiliser la propriété sans retenir comme vous l'avez suggéré et cela donne aussi une fuite de mémoire.Je pensais juste à quelque chose, est-ce que cela pourrait être parce que ma fonction est dans un objet singleton? –

+0

Non, ce n'était pas ça. J'ai essayé de le faire directement au lieu d'appeler une fonction et toujours obtenir une fuite de mémoire: self.navigationToolbarColor = [UIColor colorWithRed: (39) /255.0 vert: (64) /255.0 bleu: (139) /255.0 alpha: (1.0)] ; Dois-je relâcher l'UIColor quelque part après l'avoir assigné à la teinte du contrôleur de navigation? Je ne pensais pas que c'était nécessaire puisque c'est censé être un objet auto-libéré. Des indices ou des idées seraient utiles. –

0

J'ai trouvé la solution en ajoutant fondamentalement des catégories à l'objet UIColor. Cela crée mes objets de couleur personnalisés qui restent en mémoire. De cette façon, lorsque je place ma teinte dans mes différents objets dans différentes vues, je n'ai plus de fuites de mémoire. Voici un exemple de code si quelqu'un rencontre le même problème.

Voici le fichier CustomColors.h

#define RGBCOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)] 

@interface UIColor (CustomColors) 

+ (UIColor *)standardColor:(int)selectedAlpha; 

@end 

Voici le fichier CustomColors.m

#import "CustomColors.h" 

@implementation UIColor (CustomColors) 

    + (UIColor *)standardColor{ 
     static UIColor *customColor = nil; 

     if (!customColor){ 
      customColor = RGBCOLOR(135,153,188,1.0); 
      [customColor retain]; 
     } 
     return customColor; 
    } 

Puis, après y compris le #import "CustomColors.h" dans toutes mes vues, je peux attribuer mes couleurs comme ceci:

self.navigationController.navigationBar.tintColor=[UIColor standardColor]; 

@end

Et c'est tout. Maintenant, vous pouvez profiter de UIColors sans les fuites de mémoire.

+1

Recommandez fortement cette solution. Voir répondre à ma réponse. –

0

La solution statique n'est certainement PAS ce que vous voulez faire. Vous corrigez un faux problème positif avec un problème réel de cette façon. Voir la solution à iphone - UIColor leaking... need to release the object?

Juste ne vous inquiétez pas de la "fuite" et vous allez bien.