【问题标题】:Leaks in Swift 3 / iOS 10Swift 3 / iOS 10 中的漏洞
【发布时间】:2017-03-19 20:38:39
【问题描述】:

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

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

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

泄漏仅出现在 iOS 10 中,而在 iOS 9.x 上一切似乎都很正常。最重要的是,在 iOS 10 中 UISwitch 似乎也没有释放。

目前,我一直在创建各种解决方法,试图避免使用字典,在某些情况下还使用数组,这让编码变得非常烦人。

问题:

我应该对此感到担忧并尝试修复所有这些漏洞,还是等待并希望它在未来的更新中得到修复?如果是这样,是否有任何地方可以检查已知的错误等?

【问题讨论】:

    标签: swift memory-leaks swift3 ios10 instruments


    【解决方案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&lt;String,String>
    _NativeDictionaryStorageOwner&lt;String,String>

    【讨论】:

    • 你能举一个简单的可重现的例子吗?
    • @matt 我添加了重现问题的示例代码。为 Apple 开发雷达。
    • 写得很好的代码。我在实施和运行它时没有遇到任何问题。但是,我没有看到这是一个泄漏。例如,内存图工具没有报告任何问题。
    • @matt 使用 Instruments.app 中的 Leaks Instrument 在设备上运行它。它在启动后立即报告泄漏。
    • 对于 Apple 人:iOS 10 Native Swift 字典和 Sets Leak When created from Objective-C rdar://29997148
    猜你喜欢
    • 2017-02-14
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2016-12-06
    • 2016-12-29
    • 2017-01-11
    相关资源
    最近更新 更多