我有一个带有 UILabel 和 UITableView 的 View 。我正在使用此代码从数据库中获取字符串:
-(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) 显示无效。
请您参考如下方法:
尽管此代码片段似乎没有显示字符串值分配给 UI 元素的位置,但似乎问题可能源于您使用了 +[NSString stringWithUTF8String:] 在while循环内。这将返回一个自动释放的字符串,如果你想在方法范围之外使用它,你会保留它。由于这些似乎是您在代码的另一部分中用于更改 UI 的实例变量,因此您有几个选择:
-retain在退出该方法之前给他们每个人。 +alloc和 -initWithUTF8String: . 作为奖励,我还有一些其他相关的建议。
flashCardText 分配字符串来泄漏内存和 flashCardAnswer在方法的开头,因为您在 while 循环中覆盖了它们。 -[NSString getCString:maxLength:encoding:] 将查询字符串写入 char*没有 strcpy() 的缓冲区调用,或直接使用 char*来自 -cStringUsingEncoding:直接地。 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]];


