2015-11-01 41 views
0

我有一個類通過GCDAsyncSocket連接到家庭自動化主機並連續讀取事件。在某些大型配置中,每秒鐘可能會出現幾個事件,有時候每分鐘只有幾個事件。這工作到目前爲止。GCDAsyncSocket重新啓動readDataToData內存增加

現在我在Xcode中認識到我的內存越來越大。幾分鐘後,運行內存達到60-70MB,並且正在增長。所以一定有什麼錯。

我發現這個問題在我didReadData方法(最後3行),當我重新啓動readDataToData

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

有任何人的建議?

來自奧地利的歡迎!

回答

0

您是否嘗試使用Xcode儀器進行內存泄漏?我的猜測是你的seperatorData/String沒有被取消分配(或者至少不夠快)。

我有一個類似的問題與GCDAsyncSocket和一個手動的「自動釋放池」解決它,但首先你應該確定它是一個內存泄漏。

+0

是的,我試過這之前,現在再次。 35分鐘後Xcode說:「跑完了......」。我不知道我在房間裏發生了什麼事。運行35分鐘後未檢測到泄漏。應用程序內存從大約7mb增加到240mb。 – FaHa

+0

好吧,當我啓動樂器時,Xcode顯示「Finished running」。對不起,我對xcode很陌生。我嘗試了與另一個家庭自動化安裝,事件較少。同樣的結果,只是更慢。 – FaHa

+0

好的,但是你應該能夠看到在這個記憶增加期間我們創建了哪些對象。看看持久內存區域。您應該使用「標記生成」按鈕,然後您可以輕鬆比較並查看哪些對象有問題。 – hibento