Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Sqlite崩溃应用程序_Iphone_Objective C_Sqlite - Fatal编程技术网

Iphone Sqlite崩溃应用程序

Iphone Sqlite崩溃应用程序,iphone,objective-c,sqlite,Iphone,Objective C,Sqlite,我正在使用此代码向表中插入名称,我有一个问题,即在150+/-名称后,应用程序会崩溃,并使用此日志: Received memory warning. Level=1 Received memory warning. Level=2 这是密码,我做错什么了吗 if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) { for (int i = 0 ; i < count; i++) {

我正在使用此代码向表中插入名称,我有一个问题,即在150+/-名称后,应用程序会崩溃,并使用此日志:

 Received memory warning. Level=1
 Received memory warning. Level=2
这是密码,我做错什么了吗

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
    for (int i = 0 ; i < count; i++) {          
        sqlite3_stmt *insertStmt = nil;
        NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

        if(insertStmt == nil) 
        {
            NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
            const char *insertSql = [statement UTF8String];

            if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
                NSLog(@"Error while creating insert statement.");
                insertStmt = nil;
                continue;
            }

            sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);


            if(SQLITE_DONE != sqlite3_step(insertStmt)){
                NSLog(@"Error while inserting data.");
                insertStmt = nil;
                continue;
            }
            else{}

            sqlite3_reset(insertStmt);
            insertStmt = nil;
        }

        [delegate IPodLibraryFinishEntity:self];
    }

    sqlite3_close(database);
if(sqlite3\u打开([dataPath UTF8String],&database)==SQLITE\u确定){
对于(int i=0;i

}

使用仪器检查内存是否因保留而不是泄漏而丢失。后者是仍然指向的未使用内存。在工具上的分配工具中使用Heapshot

有关如何使用Heapshot查找内存裂缝,请参阅:

基本上,这种方法是运行Instruments allocate工具,获取一个heapshot,运行代码的直觉,然后另一个heapshot重复3到4次。这将指示在迭代过程中已分配而未释放的内存

要了解结果,请查看各个分配

如果需要查看对象的保留、释放和自动释放发生在何处,请使用工具:

在仪器中运行,在分配中将“记录参考计数”设置为on(必须停止记录才能设置选项)。使选择器运行,停止录制,搜索ivar(datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置


使用仪器检查内存是否因保留而不是泄漏而丢失。后者是仍然指向的未使用内存。在工具上的分配工具中使用Heapshot

有关如何使用Heapshot查找内存裂缝,请参阅:

基本上,这种方法是运行Instruments allocate工具,获取一个heapshot,运行代码的直觉,然后另一个heapshot重复3到4次。这将指示在迭代过程中已分配而未释放的内存

要了解结果,请查看各个分配

如果需要查看对象的保留、释放和自动释放发生在何处,请使用工具:

在仪器中运行,在分配中将“记录参考计数”设置为on(必须停止记录才能设置选项)。使选择器运行,停止录制,搜索ivar(datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置


在启动每个Insert语句之前,使用sqlite3\u open并在执行查询putsqlite3\u close语句之后。这样,在每次执行Insert查询之后,数据库对象就不会再忙碌。

在启动每个Insert语句之前,请使用sqlite3\u open并在执行查询putsqlite3\u close语句之后。这样,在每次执行插入查询之后,数据库对象就不会再忙了。

您的代码不是最优的。您应该将所有的prepare方法放在循环之前

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {

    sqlite3_stmt *insertStmt = nil;
    NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

    if(insertStmt == nil) {
        NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
        const char *insertSql = [statement UTF8String];

        if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
            NSLog(@"Error while creating insert statement.");
            insertStmt = nil;
            return;
        }
    }
    for (int i = 0 ; i < count; i++) {          
        sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(insertStmt)){
            NSLog(@"Error while inserting data.");
            continue;
        }
        else{}

        sqlite3_clear_bindings(insertStmt); //release bindings
        sqlite3_reset(insertStmt);

        [delegate IPodLibraryFinishEntity:self];
    }
    sqlite3_close(database);
}
if(sqlite3\u打开([dataPath UTF8String],&database)==SQLITE\u确定){
sqlite3_stmt*insertStmt=nil;
NSString*name=[song valueForProperty:MPMediaItemPropertyTitle];
如果(insertStmt==nil){
NSString*语句=[NSString stringWithFormat:@“插入歌曲(名称)值(?)”;
const char*insertSql=[statement UTF8String];
if(sqlite3\u prepare\u v2(数据库,insertSql,-1,&insertStmt,NULL)!=SQLITE\u确定){
NSLog(@“创建insert语句时出错”);
insertStmt=nil;
返回;
}
}
对于(int i=0;i
您的代码不是最佳的。您应该将所有的prepare方法放在循环之前

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {

    sqlite3_stmt *insertStmt = nil;
    NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

    if(insertStmt == nil) {
        NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
        const char *insertSql = [statement UTF8String];

        if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
            NSLog(@"Error while creating insert statement.");
            insertStmt = nil;
            return;
        }
    }
    for (int i = 0 ; i < count; i++) {          
        sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(insertStmt)){
            NSLog(@"Error while inserting data.");
            continue;
        }
        else{}

        sqlite3_clear_bindings(insertStmt); //release bindings
        sqlite3_reset(insertStmt);

        [delegate IPodLibraryFinishEntity:self];
    }
    sqlite3_close(database);
}
if(sqlite3\u打开([dataPath UTF8String],&database)==SQLITE\u确定){
sqlite3_stmt*insertStmt=nil;
NSString*name=[song valueForProperty:MPMediaItemPropertyTitle];
如果(insertStmt==nil){
NSString*语句=[NSString stringWithFormat:@“插入歌曲(名称)值(?)”;
const char*insertSql=[statement UTF8String];
if(sqlite3\u prepare\u v2(数据库,insertSql,-1,&insertStmt,NULL)!=SQLITE\u确定){
NSLog(@“创建insert语句时出错”);
insertStmt=nil;
返回;
}
}
对于(int i=0;i