0

J'ai une application iOS qui fait beaucoup de calculs et utilise le standard ARC pour la gestion de la mémoire. Après je l'ai couru pendant quelques minutes il se bloque en raison d'être hors de la mémoire. J'ai vérifié avec des instruments et la plupart de la mémoire est mangée par des allocations d'un appel aux commentaires de NSStringSeparatedByString.Pourquoi la mémoire allouée par componentsSeparatedByString n'est-elle jamais allouée

J'ai essayé de le faire fonctionner dans un pool d'autorelease, mais cela n'a pas beaucoup aidé. Comme il n'y a aucune référence à cette chaîne en dehors de ma fonction, je suis confus pourquoi la mémoire n'est pas automatiquement désallouée. J'ai aussi une autre fonction qui a le même problème avec commentsSeparatedByString.

Voici le code:

- (void) processWorkWithExtraData:(NSData *) extraData 
{ 
@autoreleasepool { 

    NSString *string = [[NSString alloc] initWithData:extraData encoding:NSUTF8StringEncoding]; 

    NSArray *dataArray = [string componentsSeparatedByString:@","]; // eats up memory like crazy!!! 

    NSMutableArray *objectArray = [[NSMutableArray alloc] init]; 

    for (int i=0;i<[dataArray count];i += 1) 
    { 
     TestObject *p = [[TestObject alloc] initWithFloat:[[dataArray objectAtIndex:i] floatValue]]; 

     [objectArray addObject:p]; 

    } 

    [self processArray: objectArray]; // just performs math computations on the floats in the objects 

} 
} 

Si quelqu'un peut me le faire savoir pourquoi la mémoire ne serait pas libéré ici s'il vous plaît laissez-moi savoir.

Répondre

0

cernées le problème, je pensais que j'utilisais ARC mais je ne (:

est une bonne chose cela résout mes problèmes de mémoire

chose Bad est qu'il est beaucoup plus lent (50-70. % plus lent).

Je suppose que ce prix on doit payer pour la magie qui est ARC.

+0

ARC ne devrait pas être. plus lentement il fait le même travail que le comptage de référence manuelle, à l'exception du compilateur prend en charge En fait, ARC est généralement légèrement plus rapide car le compilateur LLVM est capable de o supprimer les appels de rétention/libération/autorelease inutiles. Si j'étais vous, je passerais par le profileur de temps dans Instruments et verrais si je pourrais comprendre ce qui prend si longtemps. –

+0

Littéralement, la seule chose que j'ai changé était le réglage ARC, ce qui a clairement un impact direct. Le programme implique une simulation basée mathématiquement donc elle est supposée être 'lente', bien qu'il se peut que mon code de gestion d'objet ne soit pas optimal (j'ai des milliers de petits objets) ce qui explique pourquoi l'ARC a un tel effet. – Locksleyu

+0

Si ce que vous dites est vrai, vous devriez signaler un bug au service de rapport de bug d'Apple et utiliser votre application comme exemple. L'ARC ne devrait pas être plus lent. Il vaudrait la peine d'exécuter les versions non-ARC et ARC via le profileur de performance Instruments et de voir d'où vient le temps supplémentaire. La seule chose à laquelle je peux penser est que la gestion différente des pools de libérations automatiques entraîne une baisse de la mémoire de votre application et génère du "churn", mais cela semble improbable. La limite entre la perte de mémoire faible et le crash est assez mince. –