如何释放我们需要在return语句中使用的NSMutableArray

时间:2012-11-30 09:31:13

标签: iphone sqlite memory-leaks retain autorelease

为我的iPhone应用程序使用SQLITE数据库

在我的应用程序数据库中重试数据库中的内容我使用了一个数组,并在数据库方法中返回此数组,用于select语句,

为此我分配一个数组,我需要释放数组,

NSMutableArray *allContacts = [[NSMutableArray alloc] init];
 return allContacts;

如果我发布一个数组,我在return语句中使用了多少shd

如果我试图在返回后释放(我们可以在返回后做任何事情)

,反之亦然

请解决任何问题......

我们应该如何使用自动释放NSMutable数组

//Select statement for contacts
//==================================
+ (NSMutableArray*) selectAllContactsFromDB
{
      NSString *DBPath = [self copyDBFile];
      sqlite3 *contactsDB = nil;
      sqlite3_stmt *statement = nil;
      NSMutableArray *allContacts = [[NSMutableArray alloc] init];

      if (sqlite3_open([DBPath UTF8String], &contactsDB) == SQLITE_OK)
      {
            NSString *query = [NSString stringWithFormat: @"SELECT ROWID, NAME, MOBILE,  FROM CONTACTINFO"];
            if(sqlite3_prepare_v2(contactsDB, [query UTF8String], -1, &statement, NULL) == SQLITE_OK)
            {
                  while (sqlite3_step(statement) == SQLITE_ROW)
                  {
                        Contact *contact = [[Contact alloc] init];
                        contact.rowid = sqlite3_column_int(statement, 0);
                        contact.name = [NSString stringWithUTF8String:(const char*) sqlite3_column_text(statement, 1)];
                        contact.mobile = [NSString stringWithUTF8String:(const char*) sqlite3_column_text(statement, 2)];


                        [allContacts addObject:contact];
                  }
            }
            else {
                  NSLog(@"Statement not prepared");
            }
      }
      [DBPath release];
      return allContacts;
}

5 个答案:

答案 0 :(得分:3)

从方法返回已分配的对象时,将其作为autoreleased对象传递。

return [allContacts autorelease];

获得autoreleased对象后,您需要retain以供进一步使用:

所以改变调用方法,如;

NSMutableArray *temp = [[YourClass selectAllContactsFromDB] retain];

答案 1 :(得分:1)

试试这个

NSMutableArray *allContacts = [[[NSMutableArray alloc] init] autorelease];

也喜欢这个..

return [allContacts autorelease];

答案 2 :(得分:1)

你可以写return语句 return [allContacts autorelease]; 或者您可以在项目中使用ARC

答案 3 :(得分:1)

使用ARC(自动引用计数),或者你有一个属性作为可变数组,只返回数组......

让你开始使用ARC,请注意:http://www.youtube.com/watch?v=FxuI4e_Bj58

答案 4 :(得分:1)

您必须使用autorelease

return [allContacts autorelease];

这样il将在下次刷新自动释放池时释放。您遵循了黄金法则:对于每个alloccopyretain,您必须拥有releaseautorelease