Iphone 从sqlite数据库加载的字符串导致范围外对象
我有一个数据库管理器,它成功地从我的sqlite数据库加载一个字符串,然后使用它创建一个对象。我将这些对象中的多个添加到一个数组中,并将其返回给调用它的任何类 在调用它的方法中使用返回的数组没有问题,但是当类中的其他方法尝试访问它时,string元素超出了范围 这是我的相关代码 在DBManager.m中:Iphone 从sqlite数据库加载的字符串导致范围外对象,iphone,objective-c,sqlite,Iphone,Objective C,Sqlite,我有一个数据库管理器,它成功地从我的sqlite数据库加载一个字符串,然后使用它创建一个对象。我将这些对象中的多个添加到一个数组中,并将其返回给调用它的任何类 在调用它的方法中使用返回的数组没有问题,但是当类中的其他方法尝试访问它时,string元素超出了范围 这是我的相关代码 在DBManager.m中: -(NSArray *)loadObjectData { NSMutableArray *myArray = [[NSMutableArray alloc] init];
-(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 = @"String";
一切正常。在
对象
类中,您是否保留了此字符串如果没有,那么我认为您应该在解除锁定中释放此字符串查看此问题的公认答案-
字符串文字(@“string”
)可以工作,因为它是静态分配的,不需要保留/释放<代码>[NSString stringWithUTF8String::
创建自动删除的字符串。如果您没有将它保留在initWithID:Name:
方法中,那么它将被释放,这就是代码无法工作的原因。在您的initWithID:Name:
方法中,当您将名称重新分配给对象的实例变量时,请保留该名称。非常感谢。我认为这是sqlite代码的问题。不过这解决了这个问题。没问题——研究它可以帮助我更好地理解字符串文字以及它们是如何处理的。
NSString *aString = @"String";