Строки, загруженные из базы данных sqlite, ведут к объектам вне области - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть менеджер баз данных, который успешно загружает строку из моей базы данных sqlite, а затем использует ее для создания объекта. Я добавляю несколько таких объектов в массив и возвращаю его, из какого класса я вызываю его.

У меня нет проблем с использованием возвращенного массива в методе, из которого я его вызываю, но когда другие методы класса пытаются получить к нему доступ, строковый элемент выходит из области видимости.

Вот мой соответствующий код.

В DBManager.m:

-(NSArray *)loadObjectData {
    NSMutableArray *myArray = [[NSMutableArray alloc] init];

    //prepare query and statement
    NSString *query = [NSString stringWithFormat:@"SELECT * FROM object;"];
    sqlite3_stmt *statement;

    //perform query
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) != SQLITE_OK)
        NSLog(@"Prepare Error. '%s'", sqlite3_errmsg(database));

    //get data
    while (sqlite3_step(statement) == SQLITE_ROW) {
        //read values
        int anInt = sqlite3_column_int(statement, 0);
        NSString *aString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
        //add new object to list
        [myArray addObject:[[Object alloc] initWithID:anInt Name:aString]];
    }
    if(sqlite3_finalize(statement) != SQLITE_OK)
        NSLog(@"Finalize statement error.");

    return [myArray autorelease];
}

В XViewController.h:

NSArray *listData;
SessionData *sessionData;

@property (nonatomic, retain) NSArray *listData;
@property (nonatomic, retain) SessionData *sessionData;

В XViewController.m:

- (void)viewDidLoad
{
    dbMan = [DBManager sharedDBMananager]; //its a singleton

    //Load objects to display in table
    self.listData = [dbMan loadObjectData];

    //if i try to use listData here, it works fine.
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //normal stuff cut out

    // Configure the cell...
    //the following line fails because the string in the object out of scope
    cell.textLabel.text = [[listData objectAtIndex:[indexPath row]] aString];
    //trying to access [[listData objectAtIndex:[indexPath row]] anInt] works fine though.

    return cell;
}

Если я заменю строку (в моем методе loadObjectData):

NSString *aString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)];

с этим:

NSString *aString = @"String";

все отлично работает.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Взгляните на принятый ответ на этот вопрос - Что делает назначение буквенной строки для строки NSString с "="?

Строковый литерал (@"String") работает, потому чтоон статически распределен и не требует сохранения / освобождения.[NSString stringWithUTF8String:] создает автоматически выпущенную строку.Если вы не сохраните его в своем методе initWithID:Name:, он будет освобожден, поэтому ваш код не работает.В вашем initWithID:Name: методе с сохранением, когда вы переназначаете имя переменной экземпляра вашего объекта.

0 голосов
/ 21 февраля 2012

В Object классе вы сохранили эту строку, если нет, то я думаю, что вы должны и освободить эту строку в dealloc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...