使用 sqlite 的 UIPickerView 中的内存泄漏
Posted
技术标签:
【中文标题】使用 sqlite 的 UIPickerView 中的内存泄漏【英文标题】:Memory Leaks in UIPickerView using sqlite 【发布时间】:2011-01-14 16:39:02 【问题描述】:我将 self.notes 数组添加到 UIPickerView。这就是我设置数组的方式:
NSMutableArray *notesArray = [[NSMutableArray alloc] init];
[notesArray addObject:@"-"];
[notesArray addObjectsFromArray:[dbManager getTableValues:@"Notes"]];
self.notes = notesArray;
[notesArray release];
UIPickerView 的信息是通过这种方法从数据库中获取的:
-(NSMutableArray *)getTableValues:(NSString *)table
NSMutableArray *valuesArray = [[NSMutableArray alloc] init];
if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK)
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
else
NSString *query = [[NSString alloc] initWithFormat:@"SELECT value FROM %@", table];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
while (sqlite3_step(statement) == SQLITE_ROW)
NSString *value =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
[valuesArray addObject:value];
[value release];
sqlite3_reset(statement);
[query release];
sqlite3_finalize(statement);
sqlite3_close(database);
return valuesArray;
但我不断在 Instruments 中发现这些行的内存泄漏:
NSMutableArray *valuesArray = [[NSMutableArray alloc] init];
和
[valuesArray addObject:value];
我在这里做错了什么?
感谢您的帮助!
【问题讨论】:
【参考方案1】:使用这一行代替NSMutableArray *valuesArray = [[NSMutableArray alloc] init];
:
NSMutableArray *valuesArray = [NSMutableArray array];
至于[valuesArray addObject:value];
泄漏,将您的代码更改为:
[valuesArray addObject:value];
value = nil;
【讨论】:
值不应该在这里释放,因为它没有被分配。它正在泄漏,因为容器 valuesArray 正在泄漏。 谢谢!我所有的泄漏都消失了【参考方案2】:您正在从已分配但未释放的 getTableValues 返回 valuesArray。您不能在方法中释放它,因为调用者仍然需要它。正确的方法是自动释放它。
返回 [valuesArray 自动释放];而且你也不需要在将 value 字符串添加到 valuesArray 后释放它,因为它是使用方便的构造函数创建的。
【讨论】:
以上是关于使用 sqlite 的 UIPickerView 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 UIScrollView 创建自定义水平 UIPickerView - 如何像在 UIPickerView 中一样淡出边缘?