iphone: странная утечка - PullRequest
       7

iphone: странная утечка

0 голосов
/ 04 июня 2011

Кто-нибудь может мне помочь, почему этот фрагмент кода протекает и как мы можем с ним справиться?

sqlite3 *database;
if (pickerList) {
    self.pickerList=nil;
    [pickerList release];

}
self.pickerList=[[NSMutableArray alloc] init];


NSString *dbPath = [self applicationDocumentsDirectory];

dbPath=[dbPath stringByAppendingPathComponent:@"database"];
dbPath=[dbPath stringByAppendingPathComponent:@"OFFENDERSDB.sqlite"];



if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

    if (isAlertForViolationPicker) {


        const char *sqlStatement = "SELECT * FROM VIOLATIONS_TBL";

        sqlite3_stmt *compiledStatement;

        if (sqlite3_prepare(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

            while (sqlite3_step(compiledStatement) == SQLITE_ROW) {

                NSString *recSTR=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];

                [self.pickerList addObject:recSTR];
                [recSTR release];
                recSTR=nil;             

            }
        }
        //[tempRowArray release];
        sqlite3_finalize(compiledStatement);
        //sqlite3_reset(compiledStatement);
        sqlite3_close(database);

    }
    else {

        const char *sqlStatement = "SELECT * FROM PLAN_TBL";
        sqlite3_stmt *compiledStatement;

        if (sqlite3_prepare(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

            while (sqlite3_step(compiledStatement) == SQLITE_ROW) {


                NSString *recSTR=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];

                [self.pickerList addObject:recSTR];
                [recSTR release];
                recSTR=nil;         

            }
        }
        sqlite3_finalize(compiledStatement);
        sqlite3_close(database);

    }






}

sqlite3_reset(compiledStatement);

В этом случае протекает recSTR, и я перепробовал все перечисленные ниже решения, но ни одно не помоглообновил код) Заранее спасибо

1 Ответ

1 голос
/ 05 июня 2011

Выглядит так, как будто вы можете просочиться через pickerList. У вас есть указатель на pickerList, который вы затем установите на ноль. Затем вы отправляете сообщение об освобождении в этот момент (что в действительности является запретом). Если вы используете:

if (pickerList)
{
     [pickerList release];
     self.pickerList=nil;
}

вместо вашего текущего кода, вы чувствуете себя лучше? Трудно сказать, не видя больше кода, но вы определенно хотите выпустить его до того, как установите ivar на nil. (При этом если вы выполнили @property (retain) UIPickerList * pickerList, то self.pickerList = nil освободит pickerList. Если вы это сделали, то ваш вызов [pickerList release] является избыточным.)

Вы вполне можете получить отчет об утечке recSTR из инструментов. Но это не значит, что проблема не в pickerList. Глядя на код, не исключено, что recSTR принадлежит экземпляру pickerList, который висит вокруг, потому что вы отбросили указатель на него, а затем отправили сообщение о выпуске в nil. Таким образом, вы получите утечку recSTR и pickerList.

...