2010-05-04 4 views
0

J'ai regardé partout en essayant de trouver une solution à ce problème. Rien ne semble aider.Im Stumped, Pourquoi la mémoire UIImage Texture2d n'est pas libérée

J'ai mis en place ce test de base pour essayer de trouver la cause de la raison pour laquelle ma mémoire n'a pas été libéré:

if (texture != nil) 
{ 
[texture release]; 
texture = nil; 
} 
else 
{ 
UIImage* ui = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]]; 
texture = [[Texture2D alloc] initWithImage:ui]; 
} 

Maintenant je placer dans les touches et a commencé à tester en surveillant la l'utilisation de la mémoire en utilisant des instruments au début (normalement 11.5 - 12mb) après le premier contact, sans objet existant la texture est créée et la mémoire saute à 13.5 - 14

Cependant, après le deuxième contact, la mémoire diminue, mais seulement autour de 12,5 - 13.

Il y a un morceau de mémoire visible encore occupé.

Je l'ai testé à une échelle beaucoup plus grande, en chargeant 10 de ces grandes textures à la fois La mémoire saute à plus de 30 mb et reste là, mais au second contact après avoir relâché les textures elle tombe seulement autour de 22mb.

J'ai essayé le test une autre fois en chargeant les images avec [uiimage imagenamed:] mais en raison de la mise en cache, cette méthode fonctionne, cela signifie simplement que le 30mb reste en mémoire.

Répondre

0

Il semble que j'ai trouvé le problème. Je ne sais pas exactement pourquoi cela se produit, mais il semble que lorsque je lance les instruments pour surveiller l'utilisation de la mémoire, si je surveille l'activité E/S en même temps (qui est l'instrument par défaut qui est initialement chargé), L'utilisation de la mémoire est beaucoup plus grande (plus de 3 fois plus grande) et reste en mémoire même après que les objets ont été désalloués. Je suppose que c'est à cause de la surcharge de surveillance de l'activité d'E/S. Quoi qu'il en soit, quand je l'éteins, l'utilisation de la mémoire rapporte initialement à 3.16mb (beaucoup mieux) et saute à 10mb en chargeant les 10 textures énormes et redescend à 3.16 après avoir déchargé la texture. Un résultat brillant.

0

Il n'y a qu'un seul endroit dans votre code (d'après ce que nous pouvons voir) où la texture peut être libérée et c'est à l'instruction [texture release];.

Vous devez exécuter cette instruction (ou une autre ailleurs). Avez-vous vérifié que pour chaque texture que vous allouiez, vous le libérez aussi? Vous pouvez ajouter des instructions NSLog pour aider, comme suit:

if (texture != nil) { 
    NSLog("releasing texture instance: %08x", texture); 
    [texture release]; 
    texture = nil; 
} else { 
    ... 
    texture = [[Texture2D alloc] initWithImage:ui]; 
    NSLog("allocated texture instance: %08x", texture); 
} 

Peut-être que la texture est conservée ailleurs? Par exemple, l'ajoutez-vous à une sous-vue ou à un tableau ou à un dictionnaire? Ceux-ci conservent leur contenu. En dernier recours, pour un problème de suivi d'allocation/libération vraiment difficile, j'ai surchargé les méthodes retain, release, dealloc pour vérifier qu'elles sont appelées quand je le souhaite. Cela pourrait être exagéré à ce stade, mais voici comment: j'ai ajouté un int myRetainCount; Ivar me aider à suivre:

-(void)release { 
    NSLog(@"release %08x %2d -> %2d (%u)", 
      self, myRetainCount, myRetainCount-1, self.retainCount); 
    myRetainCount--; 
    [super release]; 
} 

-(id)retain { 
    NSLog(@"retain %08x %2d -> %2d (%u)", 
      self, myRetainCount, myRetainCount+1, self.retainCount); 
    myRetainCount++; 
    return [super retain]; 
} 

- (void)dealloc { 
    NSLog(@"dealloc %08x %2d  (%u)", self, myRetainCount, self.retainCount); 

    // deallocate self's ivars here... 

    [super dealloc]; 
} 
+0

Merci pour votre temps, et une réponse si rapide :). Par souci de ce test, le seul endroit où cette texture est référencée (autre que dans la déclaration d'interface) est dans le code que j'ai posté. Je suis désespéré pour une explication et je peux juste essayer ces remplacements que vous avez suggérés. Cependant, je pense que le problème doit être quelque chose d'autre que je ne sais pas.Peut-être quelque chose de spécifique à Texture2D ou de la façon dont l'iPhone gère la mémoire, ou les instruments eux-mêmes. En utilisant le débogueur j'ai montré que les méthodes dealloc pour texture2d ont été appelées. – user331951

Questions connexes