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
}
}