2010-02-26 3 views
0

Je vais avoir quelques problèmes avec le code ci-dessous:iPhone fuite de mémoire et un problème de libération tableau trié

NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 
NSMutableArray *result = [NSMutableArray arrayWithArray:orderArray]; 

Si j'utilise ce code, Instruments dit que j'ai une fuite de mémoire, pourquoi?

En utilisant ce code:

NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 

NSMutableArray *result = [[NSMutableArray alloc] initWithArray:orderArray]; 

Je reçois le trop avertissement de fuite, cependant, si j'AutoRelease le résultat de l'objet, une erreur de mémoire se produit.

+0

Votre deuxième bloc de code alloue un NSMutableArray, vous devez lui envoyer un message de version ou il fuit. Lisez ceci et voyez si cela efface une certaine confusion (http://www.cocoadev.com/index.pl?AutoRelease) – conorgriffin

+0

Comme je l'ai dit, si j'envoie un message de libération, je reçois un EXC_BAD_ACCESS. J'utilise ce code dans une fonction accessoire qui est appelée partout pour commander un tableau en utilisant une clé spécifique. – arielcamus

+0

Donc, si j'utilise cette fonction: - (NSMutableArray *) orderArray: (NSMutableArray *) Tableau ByKey: (NSString *) clé croissant: (BOOL) croissant { \t NSSortDescriptor * idDescriptor = [[[NSSortDescriptor alloc] initWithKey : clé ascendante: ascendante] autorelease]; \t NSArray * sortDescriptors = [NSArray arrayWithObject: idDescriptor]; \t NSArray * orderArray = [array sortedArrayUsingDescriptors: sortDescripteurs]; NSMutableArray * result = [[[NSMutableArray alloc] initWithArray: orderArray] autorelease] \t \t \t \t retour résultat; } Est-ce que je dois conserver l'objet lorsqu'il est reçu dans un autre code? – arielcamus

Répondre

2

Voici une meilleure réponse, je pense.

- (NSMutableArray *) orderArray:(NSMutableArray *)array ByKey:(NSString *)key ascending:(BOOL)ascending 
{ 
    NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending]]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
    NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 
    NSMutableArray *result = [[[NSMutableArray alloc] initWithArray:orderArray]]; 

    [release idDescriptor]; 
    return [result autorelease]; 
} 

Alors, vous allouez idDescriptor, puis vous l'utilisez, enfin le libérer. Puisque vous renvoyez result, vous pouvez le libérer automatiquement avec le retour. J'ai une autre question cependant. Est-ce que vous référencez result ailleurs dans votre code?