一尘不染

Swift 3 / iOS 10泄漏

swift

当我运行仪器并检查是否泄漏时,显示的泄漏主要包括:

_ContiguousArrayStorage<String>
_NativeDictionaryStorageOwner<Int, CGFloat>
_NativeDictionaryStorageOwner<String, AnyObject>

这是当我使用Swift 3并在使用iOS 10的设备上进行测试时。

泄漏仅在iOS 10中显示,而在iOS 9.x上,一切似乎都很正常。最重要的是,iOS 10 UISwitch中似乎也没有取消分配。

当前,我一直在创建各种变通办法,以试图避免使用字典,在某些情况下还避免使用数组,这使得编写代码确实很烦人。

题:

我应该担心这个问题并尝试修复所有这些漏洞,还是等待并希望在以后的更新中将其修复?如果是这样,是否有地方可以检查已知的错误等?


阅读 240

收藏
2020-07-07

共1个答案

一尘不染

我遇到了同样的问题,花了很多时间进行挖掘。我发现,如果您从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>

2020-07-07