当从NSMutableDictionary派生时,FastEnumeration中的内存泄漏
我有一个类作为NSMutableDictionary(主要是委托)的子类,因为我们有一些自定义接口包装在一个字典。 当运行ios泄漏工具时,它将我的keyEnumerator方法识别为NSFastEnumerationEnumerator对象的泄漏源。
这是我的keyEnumeration方法作为包装NSMutableDictionary的委托。
- (NSEnumerator*) keyEnumerator { return [dictionary keyEnumerator]; }
泄漏的回溯总是显示一个枚举器作为源:
- (void) someMethod { for (NSString *key in myWrappedDictionary) { ... } }
这是一个典型的回溯:
calloc class_createInstance __CFAllocateObject2 -[__NSCFDictionary keyEnumerator] -[WrappedDictionary keyEnumerator] -[NSDictionary countByEnumerating... -[SomeClass someMethod]
我正在寻找解决方法或缺陷在我的一行代码中。 我正在使用ARC。
下面显示了一个示例类。 调用[WrappedDictionary createLeaks]会创build9个泄漏。
@interface WrappedDictionary : NSMutableDictionary { NSMutableDictionary *dictionary; } - (id) init; - (NSUInteger) count; - (NSEnumerator*) keyEnumerator; - (void)setObject:(id)anObject forKey:(id)key; @end @implementation WrappedDictionary - (id) init { dictionary = [NSMutableDictionary new]; return self; } - (NSUInteger) count { return [dictionary count]; } - (NSEnumerator*) keyEnumerator { return [dictionary keyEnumerator]; } - (void)setObject: anObject forKey:key { [dictionary setObject:anObject forKey: key]; } + (void) createLeaks { for (int i=0; i < 10; i++) { WrappedDictionary *dict = [WrappedDictionary new]; [dict setObject:@"1" forKey:@"1"]; [dict setObject:@"2" forKey:@"2"]; [dict setObject:@"3" forKey:@"3"]; for (NSString *key in dict) { NSLog(@"key=%@",key); } } } @end
请记住,泄漏仪器只是显示泄漏的内存分配的位置 。 这并不意味着分配点是泄漏的来源。 泄漏的可能性来源是某些方法,或者某些方法的调用者,特别是如果你把它放入一个伊维尔,然后在整个对象上留有一个保留周期。
我发现了一个简单的解决方法。
如果我改变keyEnumerator方法
- (NSEnumerator*) keyEnumerator { return [dictionary keyEnumerator]; }
至
- (NSEnumerator*) keyEnumerator { NSEnumerator *e = [dictionary keyEnumerator]; return e; }
泄漏消失。 这对我仍然没有意义,但它显然迫使编译器正确的ARC从字典返回。