GCDAsyncSocket重新启动readDataToData内存增加



我有一个类,它通过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上遇到了类似的问题,手动的"自动释放池"解决了这个问题,但首先你应该确定这是内存泄漏。

我在GCDAsyncSocket中遇到了类似的问题。我在将Xcode工作区方案添加到版本控制中找到了解决问题的方法。

DLDR;禁用队列调试(编辑方案>运行/调试>选项)

最新更新