我在 ListController 文件中有一个商店列表。我建立了一个 sqlite 数据库,其中存储了 60 家商店。在列表的顶部,我有一个搜索栏。
我创建了一个名为 DataController 的类,它负责加载和存储数据库数据。
@interface DataController : NSObject {
sqlite3 *database;
NSArray *shops;
NSDictionary* dictionaryOfShops;
}
@property (nonatomic, retain) NSDictionary *dictionaryOfShops;
@property (nonatomic, retain) NSArray* shops;
-(void)initializeShops;
initializeShops 方法从数据库加载数据,并以这种方式将结果存储到 2 个 props 中:
-(void)initializeShops{
[dictionaryOfShops release];
[shops release];
NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
if (sqlite3_open(....))
NSString *query = ....
if (sqlite3_prepare_v2(database, [query UTF8String],-1, &statement, nil) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW) {
int rId = sqlite3_column_int(statement, 0);
char *rName = (char *)sqlite3_column_text(statement, 1);
Shop* s = [[Shop alloc] init];
s.ID = rId;
if(sName != nil) s.Name = [NSString stringWithUTF8String:rName];
NSString *shopID = [[NSString alloc] initWithFormat:@"%d",s.ID];
[dictionary setObject:s forKey:shopID];
[shopID release];
[s release];
}
sqlite3_finalize(statement);
}
[query release];
dictionaryOfShops = [[NSDictionary alloc] initWithDictionary:dictionary];
shops = [[NSArray alloc] initWithArray:[dictionary allValues]];
dictionary = nil;
[dictionary release];
//Sorting
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
NSArray *sortedList =[self.shops sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
self.shops = sortedList;
[sort release];
}
问题是当用户在搜索栏中输入一些文本时,我更改了查询的值(添加 LIKE ....),然后再次调用 initializeShops 方法。这第二次造成了很多泄漏,(与 Shop 类属性有关)并且还泄漏了 NSDictionary 和 NSArray。
在将其发布给您之前,我已经尝试了不同的解决方案,但至少在我第一次调用 initilizeShops 时这不会泄漏任何东西。
我接受任何建议,因为我真的坚持下去。
更多的:
真正奇怪的是我的 var 字典和 2 个道具商店和 dictionaryOfShops 的内存管理。使用此代码
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
//add data to dictionary
dictionaryOfShops = [[NSDictionary alloc] initWithDictionary:dictionary];
shops = [[NSArray alloc] initWithArray:[dictionary allValues]];
[dictionary release]
考虑到 dictionaryOfShops 和 shop 是合成的两个属性(非原子,保留),我怎样才能在不泄漏的情况下更改它们的值?
我第一次通过这个方法时,什么都没有泄漏,从第二次开始泄漏这么多对象(集合的内容)。