【问题标题】:iOS sql read/write memoryiOS sql 读/写内存
【发布时间】:2013-12-05 18:35:18
【问题描述】:

我有个项目需要用到里面的sqlite。

我还创建了一个单例对象来管理我的 sql

但是我刚刚发现,当我在sql中读取数据时,内存一直在增长,而且似乎永远不会释放。

以下代码是我在单例对象中读取数据的方式

- (NSArray*)loadRecordPathData{
@synchronized(self)
{
    if(sqlite3_open([FILEPATH UTF8String], &database) == SQLITE_OK)
    {
        NSMutableArray *pathNames = [[NSMutableArray alloc] init];
        NSString *query = @"SELECT * FROM pathData";
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil)
            == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                BBRecordPathData *recordPathData = [BBRecordPathData new];
                int readed = (int) sqlite3_column_int(statement, 0);
                int isFavorite = (int) sqlite3_column_int(statement, 1);
                char *pathDescroption = (char *) sqlite3_column_text(statement, 2);
                char *pathStopTime = (char *) sqlite3_column_text(statement, 3);
                char *pathStartTime = (char *) sqlite3_column_text(statement, 4);
                int pathChallange = (int) sqlite3_column_int(statement, 5);
                char *pathName = (char *) sqlite3_column_text(statement, 6);

                NSString *path_StartTime = (pathStartTime) ?[[NSString alloc] initWithUTF8String:pathStartTime] : nil;
                NSString *path_StopTime = (pathStopTime) ? [[NSString alloc] initWithUTF8String:pathStopTime] : nil;
                NSString *path_Name = (pathName) ? [[NSString alloc] initWithUTF8String:pathName]:nil;
                NSString *path_description = (pathDescroption) ? [[NSString alloc] initWithUTF8String:pathDescroption]: nil;

                recordPathData.recordPathName = path_Name;
                recordPathData.recordPathStartTime = path_StartTime;
                recordPathData.recordPathStopTime = path_StopTime;
                recordPathData.recordPathDescription = path_description;
                recordPathData.challange = pathChallange;
                recordPathData.isFavorite = isFavorite;
                recordPathData.readed = readed;
                //get contain locations
                recordPathData.cotainLocations = [self getLocationsPointFromStartTimeTag:recordPathData.recordPathStartTime]; //<----from another table
                if (recordPathData.cotainLocations.count == 0 || recordPathData.cotainLocations.count < 4) {
                    recordPathData.distance = @"0.000KM";
                }else{
                    NSString *unite = @"M";
                    float distanceInMeter = 0.0;
                    for (int i = 3; i < recordPathData.cotainLocations.count; i++) {
                        if (i <= recordPathData.cotainLocations.count - 2){
                            CLLocation *startPoint = recordPathData.cotainLocations[i];
                            CLLocation *endPoint = recordPathData.cotainLocations[i + 1];
                            distanceInMeter += [startPoint distanceFromLocation:endPoint];
                        }else{
                            recordPathData.distance = @"0.000KM";
                        }
                    }
                    if (distanceInMeter > 1000.0) {
                        unite = @"KM";
                        distanceInMeter /= 1000.0;
                        recordPathData.distance = [NSString stringWithFormat:@"%.2f%@",distanceInMeter,unite];
                    }else{
                        recordPathData.distance = [NSString stringWithFormat:@"%i%@",(int)distanceInMeter,unite];
                    }
                }

                [pathNames addObject:recordPathData];
            }
            sqlite3_finalize(statement);
            sqlite3_close(database);
        }

        return pathNames;
    }
    return nil;
}

}

任何建议或意见都会有很大帮助,谢谢!

【问题讨论】:

  • 仅供参考 - 如果调用 sqlite3_prepare_v2 失败,您不会关闭数据库。
  • 使用 Instruments 并查看内存中的内容。
  • 我建议你检查返回码。

标签: ios sqlite memory


【解决方案1】:

如果您使用的是来自 Objective C 的 SQLite,您应该使用包装器,例如 FMDatabase。它将为您处理内存管理并确保您不会泄漏。

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多