J'ai passé beaucoup de time à découvrir pourquoi mon application s'est écrasée. Ma variable de comptage n'est pas correctement initialisée dans certains cas.
NSSsortingng déborde de son tampon et l'application a planté. Le débogueur ne voit aucune information de trace de la stack. Mais pourquoi?
int count = 2147483647; NSSsortingng *lines = @""; for(int i = 0; i < count; i ++) { lines = [NSSsortingng ssortingngWithFormat:@"%@%@", lines, @"\n"]; }
MISE À JOUR: Pourquoi le débogueur ne montre-t-il aucune information de trace de la stack?
Vous créez non seulement de longues strings, mais vous créez beaucoup de strings. Chaque appel à +ssortingngWithFormat:
crée une nouvelle string d'un caractère ( '\n'
) plus longue que celle précédente. Ces strings sont autoeleased mais le pool autorelease n'est jamais drainé, donc vous remplissez la memory avec un grand nombre de strings comme @"\n"
, @"\n\n"
, @"\n\n\n"
, @"\n\n\n\n"
, et ainsi de suite. Vous plantez probablement à partir de ce moment avant d'atteindre une limite de taille de tampon interne (s'il y en a une) dans NSSsortingng.
Utilisez ceci pour savoir jusqu'où vous arrivez:
int count = 2147483647; NSSsortingng *lines = @""; for (int i = 0; i < count; i++) { @try { lines = [lines ssortingngByAppendingSsortingng:@"\n"]; } @catch (NSException *ex) { NSLog(@"end after %d loops (%@)", i, [ex description]); } }