2

UILabelとUITableViewのあるビューがあります。私はこのコードを使用してデータベースから文字列を取得しています:

-(void)getOneQuestion:(int)flashcardId categoryID:(int)categoryId {
    flashCardText=[[NSString alloc] init];
    flashCardAnswer=[[NSString alloc] init];

    NSString *martialStr=[NSString stringWithFormat:@"%d", flashcardId];    
    NSString *queryStr=[[NSString alloc] initWithString:@"select flashCardText,flashCardAnswer,flashCardTotalOption from flashcardquestionInfo where flashCardId="];
    queryStr=[queryStr stringByAppendingString:martialStr]; 

    NSString *martialStr1=[NSString stringWithFormat:@"%d", categoryId];    
    NSString *queryStr2=[[NSString alloc] initWithString:@" and categoryId="];
    queryStr2=[queryStr2 stringByAppendingString:martialStr1];  
    queryStr=[queryStr stringByAppendingString:queryStr2];  

    unsigned int lengthOfString=[queryStr length];
    char temp2[lengthOfString +1];
    strcpy(temp2, [queryStr cStringUsingEncoding:NSUTF8StringEncoding]);    
    clsDatabase *clsDatabaseObject = [[clsDatabase alloc] init];    
    sqlite3_stmt *dataRows = [clsDatabaseObject getDataset:temp2];
    while(sqlite3_step(dataRows) == SQLITE_ROW) {       
        flashCardText =[NSString stringWithUTF8String:(char *)sqlite3_column_text(dataRows,0)];
        flashCardAnswer=[NSString stringWithUTF8String:(char *)sqlite3_column_text(dataRows,1)];
        flashCardTotalOption=sqlite3_column_int(dataRows,2);
    }
    sqlite3_reset(dataRows);
    sqlite3_finalize(dataRows);
    [clsDatabaseObject release];    
}

テーブルセルをクリックすると、文字列値(flashCardAnswer)が無効と表示されます。

4

1 に答える 1

2

このコードスニペットは、文字列値がUI要素に割り当てられている場所を示していないようですが、問題は+[NSString stringWithUTF8String:]whileループ内での使用に起因している可能性があります。これにより、自動解放された文字列が返されます。この文字列をメソッドの範囲外で使用する場合は、この文字列を保持しておく必要があります。これらは、UIを変更するためにコードの別の部分で使用するインスタンス変数のように見えるため、いくつかのオプションがあります。

  1. -retainメソッドを終了する前に、それぞれにを送信してください。
  2. とを使用+alloc-initWithUTF8String:ます。
  3. 詳細を処理するセッターメソッドまたはプロパティを使用します。(ありがとう、チャック!)

ボーナスとして、私は他のいくつかの関連する提案があります。

  • whileループで文字列を上書きするため、メソッドの開始時に文字列flashCardTextを割り当てることでメモリリークが発生しています。flashCardAnswer
  • 呼び出しなし-[NSString getCString:maxLength:encoding:]でクエリ文字列をchar*バッファに書き込むために使用するか、 fromを直接使用します。strcpy()char*-cStringUsingEncoding:
  • クエリ文字列の構築を簡素化する可能性はたくさんあります—間違いなくNSMutableStringを調べてください。例えば...
    NSMutableString* query = [[NSMutableString alloc] initWithString:@"select flashCardText,flashCardAnswer,flashCardTotalOption from flashcardquestionInfo"];
    [query appendFormat:@" where flashCardId=%d", flashcardId];
    [query appendFormat:@" and categoryId=%d", categoryId];
    clsDatabase *clsDatabaseObject = [[clsDatabase alloc] init];
    sqlite3_stmt *dataRows = [clsDatabaseObject getDataset:[query cStringUsingEncoding:NSUTF8StringEncoding]];
于 2009-07-24T16:53:34.400 に答える