2010-03-01 4 views
0

J'ai trouvé une fuite dans mon code où l'archivage et le désarchivage d'un NSURLResponse causait une fuite, et je n'arrive pas à comprendre pourquoi. Instruments signale une fuite lorsque je désarchive la réponse NSURLResponse. Si je commente cela et ne l'utilise pas, il n'y a pas de fuite. Ce qui était intéressant était la place que je sauvé les pièces du NSURLResponse il n'y a pas de fuite:Pourquoi ma mémoire NSURLResponse fuit-elle lorsqu'elle est archivée?

// Encode: 

[archiver encodeObject:[response URL] forKey:@"URL"]; 
[archiver encodeObject:[response MIMEType] forKey:@"MIMEType"]; 
[archiver encodeObject:[NSNumber numberWithLongLong:[response expectedContentLength]] forKey:@"expectedContentLength"]; 
[archiver encodeObject:[response textEncodingName] forKey:@"textEncodingName"]; 

    // Decode: 

NSURL *url = [unarchiver decodeObjectForKey:@"URL"]; 
NSString *mimeType = [unarchiver decodeObjectForIKey:@"MIMEType"]; 
NSNumber *expectedContentLength = [unarchiver decodeObjectForKey:@"expectedContentLength"]; 
NSString *textEncodingName = [unarchiver decodeObjectForKey:@"textEncodingName"]; 

NSURLResponse* response = [[NSHTTPURLResponse alloc] initWithURL:url MIMEType:mimeType expectedContentLength:[expectedContentLength longLongValue] textEncodingName:textEncodingName]; 

Quelqu'un sait pourquoi il en est? Y a-t-il un bug avec l'archivage de NSURLResponse ou est-ce que je fais quelque chose de mal?

Répondre

1

La gestion de la mémoire dans Objective-C est aussi simple que de savoir que chaque fois que vous appelez quelque chose avec "alloc", "new" ou "copy" dans le nom de la méthode, vous devez relâchez-le à un moment donné. Pour plus d'informations: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

Dans votre cas, il apparaît que vous appelez alloc pour créer un NSMutableData, mais ne le libérez jamais (So [saveData release] à la fin de doStuffWithResponse: peut résoudre au moins une fuite). De ce code, cela semble également être le cas avec votre NSKeyedUnarchiver alloué et votre allocution NSURLResponse. Si vous ne maintenez pas la valeur, comme dans un ivar, vous pouvez aussi appeler autorelease juste après l'attribution, ou utiliser les créateurs libérés par la classe s'ils sont disponibles (par exemple [NSString stringWithFormat:] au lieu de [[ NSString alloc] initWithFormat:]). La sélection de Build> Build et Analyze peut également révéler de tels problèmes.

+0

Ce code existe réellement, sous la // version, nettoyer la section des objets. Je ne l'ai pas fourni pour mettre davantage l'accent sur l'endroit exact qui cause des fuites, mais je suppose que cela cause plus de confusion. Comme je l'ai dit, si je commente la ligne de code particulière, les instruments signalent des fuites nulles - l'analyseur statique ne se plaint pas non plus des fuites simples que cela. Je libère tous les objets que je pose ma question. –

Questions connexes