0

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

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

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

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

如果我释放一个数组,我将如何在 return 语句中使用

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

请问有什么解决办法......

我们应该如何使用自动释放 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;
}
4

5 回答 5

3

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

return [allContacts autorelease];

当你得到一个autoreleased对象时,你需要retain它以供进一步使用:

所以改变调用方法,如;

NSMutableArray *temp = [[YourClass selectAllContactsFromDB] retain];
于 2012-11-30T09:34:52.880 回答
1

试试这样

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

而且也是这样。。

return [allContacts autorelease];
于 2012-11-30T09:33:07.277 回答
1

您可以编写返回语句 return [allContacts autorelease]; ,也可以ARC在您的项目中使用。

于 2012-11-30T09:35:21.647 回答
1

使用 ARC(Automatic Reference Counting) 或者你有一个属性作为一个可变数组并且只返回数组......

要让您开始使用 ARC,请观看:http ://www.youtube.com/watch?v=FxuI4e_Bj58

于 2012-11-30T09:35:55.667 回答
1

您将不得不使用autorelease

return [allContacts autorelease];

这样 il 将在下次刷新自动释放池时被释放。而且您遵循了黄金法则:对于每个alloc, copyor retain,您必须有一个releaseor autorelease

于 2012-11-30T09:36:17.477 回答