У меня есть менеджер баз данных, который успешно загружает строку из моей базы данных 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";
все отлично работает.