简体   繁体   English

GCDAsyncSocket重新启动readDataToData内存增加

[英]GCDAsyncSocket restart readDataToData memory increasing

I have a class that connects via GCDAsyncSocket to a home automation host and reads the events continuously. 我有一个通过GCDAsyncSocket连接到家庭自动化主机并连续读取事件的类。 In some big configurations there could be a few events per second sometimes just a few events per minute. 在某些大型配置中,每秒可能有几个事件,有时每分钟可能只有几个事件。 That works so far. 到目前为止有效。

Now I recognized in Xcode that my Memory is growing bigger an bigger. 现在,我在Xcode中认识到我的记忆越来越大。 After a few minutes running memory went up to 60-70MB and growing. 几分钟后,运行内存增加到60-70MB,并且还在增长。 So there must be something wrong. 因此,一定有问题。

I found the problem in my didReadData method (last 3 lines) when i'm restarting the readDataToData 重新启动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)

    }

}

When i'm commenting these lines the read operation will not start again, but my memory problem is also away ;) 当我评论这些行时,读取操作将不会再次开始,但是我的内存问题也消失了;)

My events struct: 我的活动结构:

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

Has anybody a suggestion? 有人建议吗?

Greets from Austria! 来自奥地利的问候!

Did you try Xcode instruments for the memory leak? 您是否尝试过Xcode工具来解决内存泄漏? My guess is your seperatorData / String didn't get deallocated (or at least not fast enough). 我的猜测是您的seperatorData / String没有被释放(或至少不够快)。

I had an similar issue with GCDAsyncSocket and a manual "autorelease pool" solved it, but first you should be sure it's a memory leak. 我在GCDAsyncSocket上也遇到了类似的问题,手动的“自动释放池”解决了该问题,但是首先您应该确定这是内存泄漏。

I had a similar issue in GCDAsyncSocket. 我在GCDAsyncSocket中遇到了类似的问题。 I found a solution to my problem in Adding Xcode Workspace Schemes to Version Control . 我在将Xcode工作区方案添加到版本控制中找到了解决问题的方法。

DLDR; DLDR; Disabled Queue Debugging (Edit Scheme > Run/Debug > Options) 禁用的队列调试(“编辑方案”>“运行/调试”>“选项”)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM