0

アプリを実行しようとしましたが、メモリ割り当てで多くのクラッシュが発生しました。次に、すべてのコードを削減してクリーンアップしようとすると、この e が表示されます

なぜ私は得る:

101 行目に割り当てられ、「livello」に格納されたオブジェクトの潜在的なリーク

- (id) leggiLivelloDaTabella:(NSString *)tabella {

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"DataBase.sqlite"];

sqlite3 *database;

Livello *livello = nil;

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    // query che ricava i valori
    const char *sql =  [[NSString stringWithFormat:@"select * from Livelli WHERE Tabella = '%@'",tabella] UTF8String];

    sqlite3_stmt *selectstmt;

    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
        while(sqlite3_step(selectstmt) == SQLITE_ROW) {
            // ricaviamo i valori letti dalla query
            NSString *nomeTabella = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];
            NSString *risposteGiuste = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
            NSString *stato = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
            NSString *risposteMinime = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];
            NSString *tentativiSbagliati = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)];
            NSString *tentativiTotali = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 5)];    
            NSString *popUp = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];
            NSString *idLivello = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];

            livello = [[Livello alloc] initLivelloWithTabella:nomeTabella
                                                            rispGiuste:risposteGiuste
                                                          statoLivello:stato 
                                                            rispMinime:risposteMinime 
                                                    tentativiSbagliati:tentativiSbagliati
                                                          tentativiTot:tentativiTotali
                                                          disaplyPopUp:popUp
                                                                idLevel:idLivello];
        }
    }
    sqlite3_finalize(selectstmt);
    sqlite3_close(database);
    selectstmt = nil;
}
else
    sqlite3_close(database);

return  livello;

}

4

1 に答える 1

2

ARC (自動参照カウント) を使用していない場合は、livello を autorelease としてマークする必要があります。これを return ステートメントとして使用してみてください。

return [livello autorelease];

ARC に関する詳細情報は次のとおりです。

http://maniacdev.com/ios-5-sdk-tutorial-and-guide/arc-automatic-reference-counting/

http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

于 2012-06-18T18:03:04.777 に答える