前段時(shí)間做一個(gè)智能路由器的項(xiàng)目蕾总,要求使用MQTT囤屹,研究了幾個(gè)相關(guān)的框架笑跛,還是選擇MQTTClient付魔,因?yàn)樗陌姹靖卤容^快!
項(xiàng)目應(yīng)用場(chǎng)景
本地連接路由器WiFi堡牡,本地MQTT通信抒抬,配置路由器過(guò)程中路由器會(huì)重啟,待路由器重啟成功之后MQTT自動(dòng)連接晤柄。如果沒有本地連接路由器就使用MQTT遠(yuǎn)程通信擦剑。
項(xiàng)目中MQTT會(huì)有經(jīng)常斷開和自動(dòng)連接的需求,在斷開重連的時(shí)候各種崩潰芥颈,主要原因就是MQTTClient斷開連接之后惠勒,某些類的數(shù)據(jù)沒有釋放完全,或者是對(duì)象內(nèi)存釋放時(shí)爬坑,所用內(nèi)存并沒有完全被擦除纠屋,仍有舊對(duì)象部分?jǐn)?shù)據(jù)可用,重連的時(shí)候又使用到了這個(gè)類盾计,導(dǎo)致crash售担。
如下關(guān)閉了MQTTClient:
但是馬上重新連接就會(huì)crash:
這里self已經(jīng)為nil,但是線程還是會(huì)走到這里署辉,導(dǎo)致奔潰族铆。
所以,我建立了兩個(gè)MQTTClient管理的類哭尝,SQMQTTClientManager和SQMQTTClientLocationManager哥攘,一個(gè)管理遠(yuǎn)程通信,一個(gè)管理本地通信。這樣可以解決本地與遠(yuǎn)程切換crash的問(wèn)題逝淹。