我有一個類通過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
}
}
}
有任何人的建議?
來自奧地利的歡迎!
是的,我試過這之前,現在再次。 35分鐘後Xcode說:「跑完了......」。我不知道我在房間裏發生了什麼事。運行35分鐘後未檢測到泄漏。應用程序內存從大約7mb增加到240mb。 – FaHa
好吧,當我啓動樂器時,Xcode顯示「Finished running」。對不起,我對xcode很陌生。我嘗試了與另一個家庭自動化安裝,事件較少。同樣的結果,只是更慢。 – FaHa
好的,但是你應該能夠看到在這個記憶增加期間我們創建了哪些對象。看看持久內存區域。您應該使用「標記生成」按鈕,然後您可以輕鬆比較並查看哪些對象有問題。 – hibento