2015-10-21 1 views
0

J'essaye actuellement de créer une fonction qui rende beaucoup de sérialisation json depuis NSString.Problème de mémoire utilisant ARC dans une grande boucle utilisant NSJSONSerialization

NSArray* array = nil; 
NSError* error = nil; 
for (NSObject* obj in otherArray) { 
    array = [NSJSONSerialization JSONObjectWithData:[obj.json dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; 

    // I'm using array here .. and then i don't need it anymore 
} 

Ici mon otherArray peut être très grand et obj.json aussi.

Mais après un certain temps, l'application plante en raison d'un problème de mémoire (> 1 Go). Il semble que mon tableau ne soit jamais rompu dans la boucle for car quand je commente la ligne, je ne reçois aucune erreur. Comment puis-je libérer de la mémoire avec ARC?

Merci

Répondre

1

Utilisez un bloc de piscine autorelease dans la boucle pour réduire l'empreinte mémoire du programme:

NSArray* array = nil; 
NSError* error = nil; 
for (NSObject* obj in otherArray) { 
    @autoreleasepool { 
     array = [NSJSONSerialization JSONObjectWithData:[obj.json dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; 

     // I'm using array here .. and then i don't need it anymore 
    } 
} 

De nombreux programmes créent des objets temporaires qui sont autoreleased. Ces objets s'ajoutent à l'empreinte mémoire du programme jusqu'à la fin du bloc . Dans de nombreuses situations, l'autorisation d'accumuler des objets temporaires jusqu'à la fin de l'itération de la boucle d'événements actuelle n'entraîne pas de surcharge excessive de ; Dans certaines situations, cependant, vous pouvez créer un grand nombre d'objets temporaires qui ajoutent sensiblement à la mémoire et que vous souhaitez éliminer plus rapidement. Dans ces derniers cas, vous pouvez créer votre propre bloc de pool autorelease. À la fin du bloc, les objets temporaires sont libérés, ce qui généralement entraîne leur désallocation, réduisant ainsi la mémoire du programme .

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-SW2

+0

Je viens juste de lire la doc Apple à propos de bloc @autorealeasepool et je pense que c'est la solution parfaite pour mon problème! Merci ! –

+0

De rien. S'il vous plaît ne pas oublier d'accepter ma réponse, merci :) – iOSX