我写了一个类,它充当过滤器。我传递了三个对象:
在我传递这些对象的类中,有一个tableView,我在其中显示这些项。 这个类有自己的NSMutableArray和NSMutableDictionary,我没有初始化它们,只保留过滤器类的相应返回值。在delloc方法中,我释放它们。过滤器类中有一个方法:
+ (void)insertItem:(id)item forPeriod:(NSString *)period toContainer:(NSMutableDictionary *)container {
if ( ![[container allKeys] containsObject:period] ) {
// the period isn't stored, create and store it
NSMutableArray *periodArray = [[NSMutableArray alloc] init];
[container setObject:periodArray forKey:period];
[periodArray release];
periodArray = nil;
}
// store the item
NSMutableArray *arrayForPeriod = [container objectForKey:period];
[arrayForPeriod addObject:item];
arrayForPeriod = nil;
}
当我将新分配的数组设置为字典的对象时,仪器显示泄漏。在这一点上这肯定是正确的,因为字典再次保留了数组,所以在发布之后,它保留计数仍为1.但我认为在调用者类中,当我发布字典时,数组也将被释放。我错了吗?
答案 0 :(得分:0)
是的,它被认为是泄漏,因为你的var是一个局部变量。然后你仍然在内存中有一个对象,但没有引用它。请记住init生成一个retain +保留由dictionary = 2保留。只需使用
创建阵列即可NSMutableArray * periodArray = [[[NSMutableArray alloc] init] 自动释放]
是否清楚?
答案 1 :(得分:0)
您可以切换到ARC。或者,检查静态分析器对您的代码的看法。它很擅长发现内存泄漏,比大多数人更好。
一旦你的词典中有几百个对象,就会浪费大量的时间和内存。字典没有隐藏在某处的所有键的数组,每次调用方法时都必须创建它。那是复制几百个指针(便宜)并保留它们(昂贵)。用于数组的containsObject将对象与调用isEqual的数组中的每个对象进行比较:这很昂贵。这是每次NSString比较。该阵列是自动释放的,当它最终消失时,它中的所有键都被释放。又贵了。
NSDictionary使用哈希表,因此[objectForKey]将立即转到正确的对象。一次操作而不是数百次。