我遇到了同样的问题,花了很多时间进行挖掘。我发现,如果您从Objective- C代码创建Swift对象,并且Swift对象具有本机Swift字典属性,则会看到此泄漏。如果所有代码都是Swift,则不会发生这种情况,更有用的是,如果将本机Swift字典更改为NSDictionary,也不会泄漏。这也适用于Swift Set和NSSet。我还看到泄漏发生在iOS 10而不是iOS 9上。
// LeakySwiftObject.swift
class LeakySwiftObject: NSObject {
let dict = [String: String]() // <- Any native Swift dictionary will reproduce the leak
}
// ObjectiveCObject.h
@class LeakySwiftObject;
@interface ObjectiveCObject : NSObject
@property (strong) LeakySwiftObject *leaky;
@end
// ObjectiveCObject.m
@implementation ObjectiveCObject
- (instancetype)init
{
self = [super init];
if (self) {
self.leaky = [LeakySwiftObject new];
}
return self;
}
@end
// ViewController.swift
class ViewController: UIViewController {
let testObj = ObjectiveCObject()
}
泄漏工具报告泄漏: _NativeDictionaryStorageImpl <String,String
> _NativeDictionaryStorageOwner <String,String
>