Ios 快速反思+;类型转换/检查=内存泄漏:如何排除故障?

Ios 快速反思+;类型转换/检查=内存泄漏:如何排除故障?,ios,swift,reflection,memory-leaks,swift2,Ios,Swift,Reflection,Memory Leaks,Swift2,我创建了一个可序列化的协议,该协议使用反射将对象转换为[String:AnyObject]对象(JSON格式),但在Swift 2.1中键入casting/checking时会收到泄漏警告 我已经知道Swift存在一些内存泄漏问题,正如SwifityJSON项目(link:)中所述,但是如果没有这些泄漏,我无法让代码正常工作 我正在使用Xcode 7.1.1(7B1005)和Swift 2.1,我的部署目标是8.0,应用程序正在Iphone 5模拟器中运行 有人知道这个问题的解决方法吗?也许我做

我创建了一个可序列化的协议,该协议使用反射将对象转换为
[String:AnyObject]
对象(JSON格式),但在Swift 2.1中键入casting/checking时会收到泄漏警告


我已经知道Swift存在一些内存泄漏问题,正如SwifityJSON项目(link:)中所述,但是如果没有这些泄漏,我无法让代码正常工作

我正在使用Xcode 7.1.1(7B1005)和Swift 2.1,我的部署目标是8.0,应用程序正在Iphone 5模拟器中运行

有人知道这个问题的解决方法吗?也许我做错了什么。我的代码:(只需将代码添加到项目并调用测试函数。然后,使用泄漏配置文件运行):

消息泄露了


Swift存在一些内存泄漏问题????不也许SwiftyJSON有(我不太了解SwiftyJSON),但SwiftYep没有,很遗憾他有。使用“开关”切换类型会泄漏Xcode 7.2 Beta的内存。此外,在一些版本之前,结构和可选字符串导致了一些泄漏。您所说的“切换类型”是什么意思。可能有一些关于这个“bug”的简化例子可以帮助我们讨论这个问题吗?我的意思是用switch+case检查对象类型。在我的回答中,我在SwifityJSON中发布了这个讨论的链接。我做了一个OSX项目,你的测试函数在循环和仪器中,我没有遇到任何泄漏…Swift有一些内存泄漏问题????不也许SwiftyJSON有(我不太了解SwiftyJSON),但SwiftYep没有,很遗憾他有。使用“开关”切换类型会泄漏Xcode 7.2 Beta的内存。此外,在一些版本之前,结构和可选字符串导致了一些泄漏。您所说的“切换类型”是什么意思。可能有一些关于这个“bug”的简化例子可以帮助我们讨论这个问题吗?我的意思是用switch+case检查对象类型。在我的回答中,我在SwifityJSON中发布了这个讨论的链接。我做了一个OSX项目,在循环和仪器中使用您的测试函数,我没有遇到任何泄漏。。。
public class testB: Serializable {

    let a:Int
    let b:Int?

    public init() {
        a = 1
        b = nil
    }

}

public class testA : Serializable {

    let a:String
    let b:Double
    var c:[String:Serializable]
    var d:[Double]
    var e:[String:String]

    public init() {
        a = "teste"
        b = 1.2
        c = [String:Serializable]()
        c["teste"] = testB()
        d = [Double()]
        d[0] = 3.5
        e = [String:String]()
        e["teste"] = "teste"
    }    
}


public func test() {
    testA().toDictionary()
}

public protocol Serializable {

}

extension Serializable {

    func getValue(unknownValue:Any) -> Any? {

        let mi = Mirror(reflecting: unknownValue)
        if mi.displayStyle != .Optional {
            return unknownValue
        }

        if mi.children.count == 0 {
            return nil
        }

        let (_, some) = mi.children.first!
        return some
    }

    //Memory Leak happens here.
    func toDictionary() -> [String:AnyObject] {

        var result = [String:AnyObject]()

        let serializableMirror = Mirror(reflecting: self)

            for childMirror in serializableMirror.children {

                let label = childMirror.label

                if let value = self.getValue(childMirror.value) {

                    if let x = value as? NSData {
                        result[label!] = x.base64EncodedDataWithOptions(.Encoding64CharacterLineLength)

                    } else if let x = value as? NSDate {
                        result[label!] = x.timeIntervalSince1970

                    } else if let x = value as? Serializable {
                        result[label!] = x.toDictionary()

                    } else if let x = value as? [NSData] {
                        var newArray = [NSData]()
                        for xItem in x {
                            newArray.append(xItem.base64EncodedDataWithOptions(.Encoding64CharacterLineLength))
                        }
                        result[label!] = newArray

                    } else if let x = value as? [NSDate] {
                        var newArray = [NSTimeInterval]()
                        for xItem in x {
                            newArray.append(xItem.timeIntervalSince1970)
                        }
                        result[label!] = newArray

                    } else if let x = value as? [Serializable] {
                        var newArray = [[String:AnyObject]]()
                        for xItem in x {
                            newArray.append(xItem.toDictionary())
                        }
                        result[label!] = newArray

                    } else if let x = value as? [String:NSData] {
                        var newDictionary = [String:NSData]()
                        for (y,z) in x {
                            newDictionary[y] = z.base64EncodedDataWithOptions(.Encoding64CharacterLineLength)
                        }
                        result[label!] = newDictionary

                    } else if let x = value as? [String:NSDate] {
                        var newDictionary = [String:NSTimeInterval]()
                        for (y,z) in x {
                            newDictionary[y] = z.timeIntervalSince1970
                        }
                        result[label!] = newDictionary

                    } else if let x = value as? [String:Serializable] {
                        var newDictionary = [String:[String:AnyObject]]()
                        for (y,z) in x {
                            newDictionary[y] = z.toDictionary()
                        }
                        result[label!] = newDictionary

                    } else if value is NSNumber || value is String
                        || value is [Bool] || value is [Int] || value is [Double] || value is [Float] || value is [String]
                        || value is [String:Bool] || value is [String:Int] || value is [String:Double] || value is [String:Float] || value is [String:String] {
                        if let x = value as? AnyObject {
                            result[label!] = x
                        }
                    }
            }
        }
        return result
    }
}