2012-02-21 6 views
0

私はsqliteデータベースから文字列を正常にロードし、それを使ってオブジェクトを作成するデータベースマネージャを持っています。私はこれらのオブジェクトの複数を配列に追加し、それをクラスから呼び出しています。スコープ外のオブジェクトにつながるsqliteデータベースからロードされた文字列

私はそれを呼び出す方法で返された配列を使用しても問題はありませんが、クラス内の他のメソッドがそれにアクセスしようとすると、文字列要素が範囲外です。

私のrelaventコードです。 DBManager.mで

:XViewController.hで

-(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.mで

NSArray *listData; 
SessionData *sessionData; 

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

- (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"; 

すべてが正常に動作します。 Objectクラスで

答えて

0

にこの文字列を解放する - What does assigning a literal string to an NSString with "=" actually do?

文字列リテラル(@"String")作品これは静的に割り当てられ、保持/解放する必要がないためです。 [NSString stringWithUTF8String:]は、自動解放された文字列を作成します。 initWithID:Name:メソッドでそれを保持していない場合は、コードがリリースされていないため、リリースされています。 initWithID:Name:メソッドで、オブジェクトのインスタンス変数に名前を再割り当てするときに保持します。

+0

ありがとうございます。私はそれがsqliteコードの問題だと思っていた。これはそれを固定しました。 –

+0

問題ありません。文字列リテラルとその取り扱い方法を理解するのに役立ちました。 – Brian

0

あなたはこの文字列を保持していない場合は、その後私はあなたがすべきだと思うと、この質問者の受け入れ答えを見てみましょうdealloc

関連する問題