Iphone 从sqlite数据库加载的字符串导致范围外对象

Iphone 从sqlite数据库加载的字符串导致范围外对象,iphone,objective-c,sqlite,Iphone,Objective C,Sqlite,我有一个数据库管理器,它成功地从我的sqlite数据库加载一个字符串,然后使用它创建一个对象。我将这些对象中的多个添加到一个数组中,并将其返回给调用它的任何类 在调用它的方法中使用返回的数组没有问题,但是当类中的其他方法尝试访问它时,string元素超出了范围 这是我的相关代码 在DBManager.m中: -(NSArray *)loadObjectData { NSMutableArray *myArray = [[NSMutableArray alloc] init];

我有一个数据库管理器,它成功地从我的sqlite数据库加载一个字符串,然后使用它创建一个对象。我将这些对象中的多个添加到一个数组中,并将其返回给调用它的任何类

在调用它的方法中使用返回的数组没有问题,但是当类中的其他方法尝试访问它时,string元素超出了范围

这是我的相关代码

在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 = @"String";

一切正常。

对象
类中,您是否保留了此字符串如果没有,那么我认为您应该在
解除锁定

中释放此字符串查看此问题的公认答案-


字符串文字(
@“string”
)可以工作,因为它是静态分配的,不需要保留/释放<代码>[NSString stringWithUTF8String::
创建自动删除的字符串。如果您没有将它保留在
initWithID:Name:
方法中,那么它将被释放,这就是代码无法工作的原因。在您的
initWithID:Name:
方法中,当您将名称重新分配给对象的实例变量时,请保留该名称。

非常感谢。我认为这是sqlite代码的问题。不过这解决了这个问题。没问题——研究它可以帮助我更好地理解字符串文字以及它们是如何处理的。
NSString *aString = @"String";