2010-07-30 3 views
0

mon application iphone a beaucoup de boutons (j'ai créé une vue de calendrier avec des boutons) quand je l'exécute avec l'outil de fuites - aucune fuite n'est découverte. Mais en quelque sorte, l'allocation Live Bytes atteint 21 Mo et les plantages de l'application (lorsque les boutons sont cliqués environ 120 fois).Application Crash - Allocations Live Bytes atteint 20 MB

La mémoire de libération automatique du système n'est-elle plus utilisée ... s'il n'y a pas de fuite, comment la mémoire continue-t-elle d'augmenter? toute idée sur la façon d'aborder ce problème sera appréciée. Merci.

J'utilise sqlite3 dans mon application à charger (calendrier - valeurs magasins contre 30 jours à la fois) - qui appelle la fonction getSingRecord 30 fois ... ci-dessous est le code réel

-(void) insertRecordIntoTableNamed: 
{ 

NSString *sql="Insert Statement......"; 

char *err; 

if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { 
    sqlite3_close(db); 
    NSAssert(0,@"Error updating table"); 
} 

} 

-(NSString *) getSingRecord: (NSString *) getStatement{ 

NSString *sql=getStatement; 

sqlite3_stmt *statement; 

NSString *[email protected]"0"; 

if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     char *fieldFlag=(char *) sqlite3_column_text(statement, 0); 
     fieldFlagI=[[NSString alloc] initWithUTF8String:fieldFlag]; 
     //fieldFlagI=[NSString initWithUTF8String:fieldFlag]; 
    } 
    sqlite3_finalize(statement); 
} 
//NSString *ffI=fieldFlagI; 
//[fieldFlagI release] 
return [fieldFlagI autorelease]; 
} 

Répondre

1

Vous probablement plus dépendent d'un pool d'autorelease qui n'est jamais drainé. Étant donné que le pool existe et conserve vos objets conservés, les outils ne détectent pas cela comme une fuite de mémoire. Et si vous ne vidangez jamais la piscine, tous les objets que vous avez alloués sont maintenus en vie même après que vous en ayez fini avec eux.

+0

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; ... mon code ..... [drain de piscine]; ne fait même pas la moindre différence – user401383

0

Les fuites sont des objets que personne ne référence, mais qui ne sont pas libérés. Si vous gardez des objets dans une infrastructure de données et que vous les gardez, cela ne sera pas perçu comme une fuite, mais c'est un problème. Que faites-vous sur le bouton de presse?

MISE À JOUR: Sur la base de votre code

Ne pas AutoRelease le retour - vous ne pas toujours alloc il (initialisé à @ "0"), AutoRelease seulement si vous alloc il.

Mais ce n'est pas votre fuite. Dans while(), à chaque fois que vous bouclez, vous perdez le dernier que vous avez alloué - votre instruction get renvoie-t-elle définitivement une ligne? Si oui, pourquoi un moment()?

+0

J'utilise des commandes sqlite3 pour obtenir des lignes – user401383

+0

sqlite3 est pur-C - appelez-vous toutes leurs fonctions de nettoyage quand vous êtes censé? –

+0

NSString * sql = [NSString stringWithFormat: @ "Insérer ou remplacer dans les valeurs '% @' ('% @', '% @', '% @') ('% @', '% @', '% @ ') ", \t \t \t \t nomTable, champ1, champ2, champ3, champ1Valeur, champ2Valeur, champ3Valeur]; \t \t char * err; \t \t si (sqlite3_exec (db, [UTF8String sql], NULL, NULL, & err)!= SQLITE_OK) { \t \t sqlite3_close (db); \t \t NSAssert (0, @ "Erreur lors de la mise à jour de la table"); Pour l'insertion j'utilise le code ci-dessus – user401383