为我的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;
}
答案 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将在下次刷新自动释放池时释放。您遵循了黄金法则:对于每个alloc
,copy
或retain
,您必须拥有release
或autorelease
。