objective-c - 从 NSMutableDictionary 派生时 FastEnumeration 中明显的内存泄漏

标签 objective-c ios memory-leaks

我有一个类充当 NSMutableDictionary 的子类(主要是通过委托(delegate)),因为我们有一些围绕字典的自定义接口(interface)。运行 ios 泄漏工具时,它会将我的 keyEnumerator 方法识别为 NSFastEnumerationEnumerator 对象泄漏的来源。

这是我的 keyEnumeration 方法,作为包装的 NSMutableDictionary 的委托(delegate)。

- (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] 将创建 9 个泄漏。

@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

最佳答案

请记住,泄漏工具仅显示泄漏的内存分配的位置。这并不意味着分配点是泄漏的根源。更可能的泄漏源是在 someMethod 中,或者在 someMethod 的调用者中,特别是如果您将其放入 ivar 中,然后对整个对象进行保留循环.

关于objective-c - 从 NSMutableDictionary 派生时 FastEnumeration 中明显的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795683/

相关文章:

objective-c - iOS - 对 viewController 进行单元测试?

ios - 使用 Storyboard的 "inner" View 和 UITableViewCell 的内容 View 之间剩余垂直间距的原因是什么?

html - 如何在 iPhone 和 iPad 上为等效的外观高度设置缩放比例

ios - UICollectionview 未从 CoreData 完全加载图像获取随机空白单元格图像

asynchronous - MailboxProcessor.Dispose 不会使对象 GC 可收集

objective-c - Finder 和 Carbon 文件管理器中的文件夹大小存在差异

c++ - 在 Xcode 中编译 C++ 时出现很多错误

ios - 使用文件提供程序实现 UIDocumentPickerModeOpen

visual-studio-2010 - 如何找出导致内存泄漏的 Visual Studio 扩展?

linux - 分析网络应用程序中的资源泄漏(套接字处理程序等)