Skip to main content
 首页 » 编程设计

objective-c之为什么我从 SQLite 为我的 UILabel 得到一个无效的 NSString

2025年05月04日70lori

我有一个带有 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: .
  • 使用为您处理细节的 setter 方法或属性。 (谢谢,查克!)

  • 作为奖励,我还有一些其他相关的建议。
  • 您通过为 flashCardText 分配字符串来泄漏内存和 flashCardAnswer在方法的开头,因为您在 while 循环中覆盖了它们。
  • 使用 -[NSString getCString:maxLength:encoding:] 将查询字符串写入 char*没有 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]];