0

J'essaie de créer une chaîne immuable. Je ne suis pas initialisant avec init, alloc ou nouveau, mais encore la mémoire fuit et son disant « objet 0x234b533 de classe NSCFString autoreleased sans piscine en place - juste fuite » est ici ce que je suis en train de faireProblème de fuite de mémoire NSAutoreleaseNoPool()

NSMutableString *srn = [NSMutableString stringwithCString:devSID]; 

// devSID is *char 

cela laisse une fuite. J'ai essayé cela aussi

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)]; 

mais cela ne fonctionne pas trop, si je tente d'initialiser avec une simple chaîne comme celui-ci

NSMutableString *srn = @"this is my string"; 

cela fonctionne, ne pas avoir une idée ce qu'il se passe autour. Je n'utilise pas init ou alloc mais il y a toujours une fuite. Je serais obligé si quelqu'un pouvait me aider à résoudre ce problème

Cordialement

Umair

+0

N'obtenez-vous pas un avertissement de compilateur avec le dernier? – JeremyP

Répondre

-1

Essayez quelque chose comme ça

[[NSString stringWithCString: "Bonjour"] retain];

retain est un moyen d'évaluer la propriété d'objet sur les objets que vous n'avez pas créé d'abord, donc cela étend notre règle de correspondance tous les alloc avec une libération ou AutoRelease

Note: Vous devez équilibrer votre compte de libération si vous conservez cet objet. Si vous ne relâchez pas l'objet retenu, vous rencontrerez un problème de fuite de mémoire.

+0

juste une seule ligne ... et ce gars a résolu mon problème ... merci mon pote – Omayr

+2

Vous devrez équilibrer cela 'retenir' avec un' release' plus tard ou vous fuire mémoire. – paulbailey

+1

@paul @Omayr En fait, le problème est qu'il a créé un objet autorelease dans Autoreleasepool alloué .. c'est pourquoi je lui ai suggéré de conserver cet objet .. maintenant la chose qu'il doit libérer cet objet dès qu'il est fait avec la partie fonctionnelle – Tariq

8

La fuite est causée par votre autoreleasing un objet sans avoir une piscine autorelease en place pour prendre soin d'elle. Cela arrive généralement lorsque vous faites des choses en dehors du thread principal, en créant vos propres threads ou simplement en utilisant la méthode pratique -performSelectorInBackground:withObject:. Si vous voulez utiliser la fonctionnalité autorelease (implicite par l'utilisation de la méthode de classe NSMutableString ici), vous devez créer un pool autorelease au début du bloc de code où vous l'utiliserez et le vider à la fin. En d'autres termes, quelque chose le long de ces lignes:

- (void)myBackgroundThing:(id)whatever 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSMutableString *srn = [NSMutableString stringwithCString:devSID]; 

    // etc... 

    [pool release]; 
} 
+2

Même si un * ne veut pas utiliser la fonctionnalité autorelease, de nombreux objets Cocoa le feront de toute façon, donc c'est toujours une bonne idée de créer un pool pour les threads d'arrière-plan. –

+2

En fait, dans un environnement de comptage de référence, vous devriez * toujours * créer un pool autorelease pour chaque thread qui utilisera Cocoa. Si vous écrivez un outil de ligne de commande autonome, vous devez également créer un pool de libération automatique dans 'main()'. – JeremyP

+0

Il y a deux choses que je voudrais aborder 1) J'ai déjà essayé ceci mais l'application se bloque dès qu'elle insère ce bloc de autoreleasepool et de release. 2) Pourquoi ai-je besoin d'un autoreleasepool puisque je n'utilise pas init avec NSMutableString – Omayr