gpt4 book ai didi

objective-c - 正确使用FMDB/内存

转载 作者:行者123 更新时间:2023-11-29 04:49:28 25 4
gpt4 key购买 nike

我在类似的问题中找不到解决我的问题的方法。我正在使用 fmdb 包装器从 sqlite 数据库中提取一大堆数据。我的 fmdb 实用程序类中有一个与此类似的方法:

  - (NSMutableArray *) getConnectionsForKey: (NSString *) key
{

NSString *query = [NSString stringWithFormat:@"select * from user" ];



FMResultSet *results = [database executeQuery:query];

NSMutableArray *retArray = [[ NSMutableArray alloc ] init ];

while ([ results next ]) {

NSString *fname = [ results stringForColumn:@"firstname" ];
NSString *lname = [ results stringForColumn:@"lastname" ];


NSMutableDictionary *aDictionary = [[ NSMutableDictionary alloc ]
init
];

[ aDictionary
setObject:fname
forKey:@"firstname"
];

[ aDictionary
setObject:lname
forKey:@"lastname"
];



[ retArray addObject:aDictionary ];

[ aDictionary release ];


}

[ results close ];

return retArray;
}

它将我的信息存储在一系列字典中。在我的 View Controller 中,我像这样调用我的方法:

 -(void) setCurrentConnections: (NSString *) key {

if ( currentConnections != nil ) {
[ currentConnections removeAllObjects ];
}

LocalDatabase *db = [[ LocalDatabase alloc ] init ];

[ db openDatabase ];

currentConnections = [ db getConnectionsForKey:key ];

[ db closeDatabase ];
[ db release ];


}

现在,每次我调用此方法用新联系人更新我的数组时,我都会遇到一致的泄漏,正如我使用分配工具观察到的那样,泄漏不断增加。即使我在从数据库加载后立即释放 currentConnections 并且不再调用此方法,也会发生这种情况,所以我怀疑这是数据库实现的问题。有其他人解决过这个问题吗?

最佳答案

“setCurrentConnections”中的 currentConnections 发生泄漏。这是我修复它的方法(请注意,我还更改了“getConnectionsForKey”以返回自动释放的对象)。

 - (NSMutableArray *) getConnectionsForKey: (NSString *) key
{

NSString *query = [NSString stringWithFormat:@"select * from user" ];
FMResultSet *results = [database executeQuery:query];

NSMutableArray *retArray = [[ NSMutableArray alloc ] init ];
while ([ results next ]) {

NSString *fname = [ results stringForColumn:@"firstname" ];
NSString *lname = [ results stringForColumn:@"lastname" ];
NSMutableDictionary *aDictionary = [[ NSMutableDictionary alloc ] init];

[ aDictionary
setObject:fname
forKey:@"firstname"
];

[ aDictionary
setObject:lname
forKey:@"lastname"
];

[ retArray addObject:aDictionary ];
[ aDictionary release ];


}

[ results close ];

return [retArray autorelease];
}


-(void) setCurrentConnections: (NSString *) key {

[ currentConnections removeAllObjects ];
[ currentConnections release];

LocalDatabase *db = [[ LocalDatabase alloc ] init ];

[ db openDatabase ];

currentConnections = [ db getConnectionsForKey:key ];
[currentConnections retain];

[ db closeDatabase ];
[ db release ];

}

您也许可以跳过对 removeAllObjects 的调用,而只调用release。原始代码中的问题是您覆盖了对现有 currentConnection 的引用,而没有先释放它,因此导致了泄漏。

关于objective-c - 正确使用FMDB/内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9103208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com