【问题标题】:How to manage the Memory Leaks at the time of access the database?访问数据库时如何管理内存泄漏?
【发布时间】:2011-12-02 07:33:46
【问题描述】:

我正在开发一个应用程序。在那个应用程序中,我使用一个数组来返回一个函数中的值数组,以从数据库中获取数据。并为该函数分配内存并使用自动释放。但这在当时被杀死了执行该行。当 iam 释放时,dealloc 函数应用程序中的那个将崩溃。如果您不使用自动释放和释放,则会发生内存泄漏。该函数的示例如下。

-(NSMutableArray*)getWeeklyTableInfo:(int)month:(int)week
  {
     NSString *query = [NSString stringWithFormat:@"SELECT * FROM CalendarEvents where   Mont=%d and Week=%d ",month,week];
    sqlite3_stmt *stStatement;
     EventsArray1 = [[NSMutableArray alloc]init];
    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &stStatement, nil)==SQLITE_OK)
    {
      while (sqlite3_step(stStatement)==SQLITE_ROW) {
            databasefields = [[DataBaseFields alloc]init];
            databasefields.DBSno=sqlite3_column_int(stStatement, 0);
            databasefields.DBdate =[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 1)];
            databasefields.DByear=sqlite3_column_int(stStatement, 2);
            databasefields.DBmonth=sqlite3_column_int(stStatement, 3);
            databasefields.DBweek=sqlite3_column_int(stStatement, 4);
            databasefields.DBtitle = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 5)];
            databasefields.DBlocation = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 6)];
            databasefields.DBtime = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 7)];
            databasefields.DBrepeat=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 8)];
            databasefields.DBalert=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 9)];
            databasefields.DBnotes=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 10)];
            databasefields.DBaudio=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 12)];
            databasefields.DBpicture=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 11)];
            databasefields.DBPhoneNO=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 13)];
            databasefields.DBMailID=[NSString stringWithUTF8String:(char*)sqlite3_column_text(stStatement, 14)];
            [EventsArray1 addObject:databasefields];
            [databasefields release];
        }
        if (stStatement!= nil) {
            sqlite3_finalize(stStatement);
        }
    }

sqlite3_close(database);
return EventsArray1;

}

所以请告诉我该怎么做。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    您没有释放您的 EventsArray。您必须按如下方式自动释放它:

    EventsArray1 = [[[NSMutableArray alloc] init] autorelease];
    

    你不能简单地释放它,因为你在返回时使用它。

    我认为问题一定是 EventsArray 不是函数本地的。它是一个“全局”变量。所以你应该在函数内部创建一个新的 NSMutableArray ,然后将它的值赋给 EventsArray1 ,然后释放你在函数中创建的 NSMutableArray ,然后你就可以安全地返回 EventsArray 了。

    我不确定我是否理解了这个问题,但这是我在提供的示例中看到的错误。

    【讨论】:

    • 但是如果我像这样使用,那么应用程序将在这一行崩溃
    【解决方案2】:

    将您的代码替换为以下内容即可:-

    1) 你的方法第一行代码

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    

    2) 在 EventArray1 初始化期间

    EventsArray1 = [[[NSMutableArray alloc] init] autorelease];
    

    3) 方法最后一行

    [pool release];
    

    或者第二种方法是

    在名为 eventArray 的 .h 文件中声明一个 NSMutableArray

    然后内部函数实现 使用

    EventsArray1 = [[NSMutableArray alloc] init];
    
    self.eventArray=EventsArray1
    
    [EventsArray1 release];
    
    return eventArray;
    

    【讨论】:

      【解决方案3】:

      正如 Jose 所说,使用“自动释放”。

      但请记住,在使用 te 方法返回的数组时,您应该复制到新数组中。如果您使用相同的数组,应用程序将崩溃,因为分配给数组的内存已被释放。

      尝试使用 ARC,使用新的 iOS SDK,您将不必担心发布,自动发布。 ARC 会为您解决这个问题。 :)

      【讨论】:

        猜你喜欢
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 2018-06-19
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多