关于指针问题

一、概述

在用数组保存模型时,发现数组里面的数据都一样,就是在添加数据时出错

二、问题代码:

//查询数据
- (void)select{
    JZInfoModel *model = [JZInfoModel new];
    //关键字 limit 0,2 从哪个位置读 每次读几个
    NSString *selectSql = @"select * from t_student";
    //1.预处理 -1表示语句长度自己计算
    sqlite3_stmt *stmt = NULL;
    if (sqlite3_prepare(_sql, [selectSql UTF8String], -1, &stmt, NULL) == SQLITE_OK) {
        //2.一条一条读取数据 如果有 返回值就是SQLITE_ROW
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //一列一列地去读取每一条记录 1表示列
            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *age = (char *)sqlite3_column_text(stmt, 2);
            NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)];
            //NSLog(@"%s, %s, %@", name, age, [UIImage imageWithData:data]);
            
            model.img = [UIImage imageWithData:data];
            model.name = [NSString stringWithFormat:@"%s", name];
            model.age = [NSString stringWithFormat:@"%s", age];
            
            [self.modelsArr addObject:model];
            NSLog(@"%@", self.modelsArr);
        }
    } else {
        NSLog(@"预处理失败");
    }
}

打印数组:

三、原因分析

两个元素指向同一片地址 ,数组在保存数据时,并没有保存数具体的数值,而是保存地址。model里面属性的值在变,地址没有变。类似:

int a = 1;
int a = 2;

最终model保存的是最后的数据

+

四、解决方案:

每次保存模型时,重新分配空间即可,即把创建的代码放到循环中

代码:

//查询数据
- (void)select{
    //关键字 limit 0,2 从哪个位置读 每次读几个
    NSString *selectSql = @"select * from t_student";
    //1.预处理 -1表示语句长度自己计算
    sqlite3_stmt *stmt = NULL;
    if (sqlite3_prepare(_sql, [selectSql UTF8String], -1, &stmt, NULL) == SQLITE_OK) {
        //2.一条一条读取数据 如果有 返回值就是SQLITE_ROW
        while (sqlite3_step(stmt) == SQLITE_ROW) {
      //这样改 JZInfoModel
*model = [JZInfoModel new]; //一列一列地去读取每一条记录 1表示列 char *name = (char *)sqlite3_column_text(stmt, 1); char *age = (char *)sqlite3_column_text(stmt, 2); NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)]; //NSLog(@"%s, %s, %@", name, age, [UIImage imageWithData:data]); model.img = [UIImage imageWithData:data]; model.name = [NSString stringWithFormat:@"%s", name]; model.age = [NSString stringWithFormat:@"%s", age]; [self.modelsArr addObject:model]; NSLog(@"%@", self.modelsArr); } } else { NSLog(@"预处理失败"); } }

分析: 

猜你喜欢

转载自www.cnblogs.com/jianze/p/10841913.html