我有一个类,它通过 GCDAsyncSocket 连接到家庭自动化主机并连续读取事件。在一些大型配置中,每秒可能有几个事件,有时每分钟只有几个事件。到目前为止,这有效。
现在我在 Xcode 中发现我的内存越来越大。几分钟后,运行内存上升到 60-70MB,并且还在不断增长。所以一定有什么问题。
当我重新启动 readDataToData
时,我在 didReadData
方法(最后 3 行)中发现了问题
func socket(socket : GCDAsyncSocket!, didReadData data:NSData, withTag tag:Int) {
guard let rsp = NSString(data: data, encoding: NSUTF8StringEncoding) where rsp != "" else {
print("error - respone is empty")
return
}
// \n entfernen
let response = rsp.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
printVerbose("FHEM: didReadDataWithTag \(tag) and response \(response)", withVerbose: 6)
// Got Data from Events
if( tag == self.tags.getEvents ){
printVerbose("FHEM: didReadDataWithTag \(tag) and response \(response)", withVerbose: 5)
if( self.event == nil ) {
self.event = FHEMEvent()
print("neue instanz")
}
self.event!.update(response)
guard let devices = self.devices where devices.count > 0 else {
print("No Devices found")
return
}
for device in devices {
if( device.name == self.event!.name ) {
for reading in device.readings {
if( reading.0 == self.event!.reading ) {
print("FHEM: Reading Update erkannt. \(self.event!.name) -> \(self.event!.reading) -> \(self.event!.value)")
// MARK: Check ob Delegate Methode implementiert wurde
if( self.delegate?.didGetFHEMReadingsUpdate != nil ) {
self.delegate?.didGetFHEMReadingsUpdate!(self.event!.name, reading: self.event!.reading, value: self.event!.value)
}
else {
print("No method implemented")
}
}
}
}
}
self.event = nil
// Read again - HERE IS THE PROBLEM
let seperatorString = "\n"
let seperatorData = seperatorString.dataUsingEncoding(NSUTF8StringEncoding)
socket.readDataToData(seperatorData, withTimeout: -1, tag: self.tags.getEvents)
}
}
当我评论这些行时,读取操作将不会再次开始,但我的内存问题也消失了;)
我的事件结构:
struct FHEMEvent {
var timestamp:String = ""
var time:String = ""
var type:String = ""
var name:String = ""
var reading:String = ""
var value:String = ""
mutating func update( response:String ) {
let array = response.componentsSeparatedByString(" ")
if( array.count < 5 ) {
return
}
let timestamp = array[0]
let time = array[1]
let type = array[2]
let name = array[3]
var reading = array[4]
self.timestamp = timestamp
self.time = time
self.type = type
self.name = name
// reading ist wirklich ein Reading
if( reading.regExp("^.*:$") == true ) {
reading.removeAtIndex(reading.endIndex.predecessor())
var value:String = ""
if( array[5] != "" ) {
value = array[5]
}
else {
return
}
self.reading = reading
self.value = value
}
// reading ist STATE
else {
self.reading = "state"
self.value = reading
}
}
}
有人有建议吗?
来自奥地利的问候!
最佳答案
您是否尝试过 Xcode 工具来解决内存泄漏问题?我的猜测是你的 seperatorData/String 没有被释放(或者至少不够快)。
我在 GCDAsyncSocket 上遇到了类似的问题,手动“自动释放池”解决了它,但首先您应该确定这是内存泄漏。
关于xcode - GCDAsyncSocket重新启动readDataToData内存增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33461710/