寫(xiě)個(gè)簡(jiǎn)單的Swift檢測(cè)Controller沒(méi)有銷(xiāo)毀的工具

img

思路

在Swift的代碼中堡牡,Controller沒(méi)有銷(xiāo)毀大部分的原因都是沒(méi)有weak self午绳。怎么檢測(cè)一個(gè)Controller沒(méi)有釋放呢筒溃?

1马篮、當(dāng)一個(gè)對(duì)象銷(xiāo)毀的時(shí)候,它會(huì)調(diào)用deinit的方法怜奖,一般Controller頁(yè)面我們都是放在UINavigationController里面的浑测,然后調(diào)用push和pop,實(shí)現(xiàn)我們頁(yè)面的跳轉(zhuǎn)歪玲。

2迁央、繼承UINavigationController怎顾,重寫(xiě)push方法,在push方法里面把push的controller的名字放到單例的數(shù)組里面漱贱,deinit的時(shí)候在把當(dāng)前的controller從單例里面釋放槐雾,然后檢測(cè)單例里面有沒(méi)有controller的相同名字存在2個(gè)以上的。

代碼實(shí)現(xiàn)

因?yàn)槭菣z測(cè)Controller有沒(méi)有銷(xiāo)毀的工具幅狮,然后打印到console里查看募强,所以代碼應(yīng)該在DEBUG模式下執(zhí)行。

如果使用的UI架構(gòu)師tabbar加幾個(gè)controllers的樣式崇摄,初始化tabbar的時(shí)候會(huì)調(diào)用push擎值。所以判斷如果是tabbarcontroller直接return

func defaultController() -> UINavigationController {
    let navi = JYNavigationViewController.init(rootViewController: JYTabBarViewController())

    return navi
}
func pushVc(_ vc: UIViewController) {
    #if DEBUG

    if vc is JYTabBarViewController {
        return
    }
    
    vcs.append(NSStringFromClass(vc.classForCoder))
    
    #endif
}

在繼承的NavigationController實(shí)現(xiàn)push代碼

override open func pushViewController(_ viewController: UIViewController, animated: Bool) {
    viewController.hidesBottomBarWhenPushed = self.viewControllers.count > 0
    
    if self.viewControllers.count > 0 {
        viewController.showLeftButton()
    }
    
    CheckWselfHelper.shared.pushVc(viewController)
    
    super.pushViewController(viewController, animated: animated)
}

在pop代碼里調(diào)用數(shù)組的filter函數(shù),過(guò)濾掉當(dāng)前controller名字相同的內(nèi)容逐抑,然后遍歷數(shù)組鸠儿,篩選出數(shù)組中名字相同有大于1個(gè)controller,并打印出來(lái)

func popVc(_ vc: UIViewController?) {
    #if DEBUG
        guard let vc = vc else {return}
        
        let str = NSStringFromClass(vc.classForCoder)
        vcs = vcs.filter({$0 != str})
        
        var datas = [String: Int]()
        
        vcs.forEach({ (str) in
            datas[str] = (datas[str] ?? 0)+1
        })
        
        datas.forEach({ (key, value) in
            if value > 1 {
                Log.i("注意"+key+"沒(méi)有釋放")
            }
        })

    #endif
}

在BaseController的deinit方法里實(shí)現(xiàn)我們的pop函數(shù)

deinit {
    CheckWselfHelper.shared.popVc(self)
}

由于我是tabba的ui架構(gòu)厕氨,所以在點(diǎn)擊tabbar的時(shí)候會(huì)push很多tabbar和navigation的controller进每。所以在點(diǎn)擊和初始化的時(shí)候清空下我們的單例數(shù)組。

func clearVcs(_ addVc: UIViewController?) {
    #if DEBUG

    vcs.removeAll()
    
    guard let addVc = addVc else {return}
    
    pushVc(addVc)
        
    #endif
}

在tabbar里面的實(shí)現(xiàn)如下

初始化的時(shí)候清空

func initViews() {
    
    let tvc = JYTicketViewController()
    let ticketVc: JYNavigationViewController = JYNavigationViewController(rootViewController: tvc)
    let mallVc: JYNavigationViewController = JYNavigationViewController(rootViewController: JYMallViewController())
    let mineVc: JYNavigationViewController = JYNavigationViewController(rootViewController: JYMineViewController())
    
    ticketVc.tabBarItem.title = "購(gòu)票"
    ticketVc.tabBarItem.image = UIImage.init(named: "ticket_normal")?.withRenderingMode(.alwaysOriginal)
    ticketVc.tabBarItem.selectedImage = UIImage.init(named: "ticket_selected")?.withRenderingMode(.alwaysOriginal)
    
    mallVc.tabBarItem.title = "商城"
    mallVc.tabBarItem.image = UIImage.init(named: "mall_normal")?.withRenderingMode(.alwaysOriginal)
    mallVc.tabBarItem.selectedImage = UIImage.init(named: "mall_selected")?.withRenderingMode(.alwaysOriginal)
    
    mineVc.tabBarItem.title =  "我的"
    mineVc.tabBarItem.image = UIImage.init(named: "mine_normal")?.withRenderingMode(.alwaysOriginal)
    mineVc.tabBarItem.selectedImage = UIImage.init(named: "mine_selected")?.withRenderingMode(.alwaysOriginal)

    self.tabBar.barTintColor = UIColor.white
    self.tabBar.tintColor = AppConfig.mainColor
    
    let lists = [ticketVc, mallVc, mineVc]
    self.viewControllers = lists
    self.delegate = self
    self.selectedIndex = 0
    ticketVc.navigationBar.isTranslucent = false
    mallVc.navigationBar.isTranslucent = false
    mineVc.navigationBar.isTranslucent = false
    
    CheckWselfHelper.shared.clearVcs(tvc)//這里初始化默認(rèn)選中的controller

}

點(diǎn)擊tabbar的時(shí)候清空

// MARK: UITabBarControllerDelegate
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    CheckWselfHelper.shared.clearVcs(viewController.childViewControllers.first)
    
    return true
}

CheckWselfHelper.swift

https://gist.github.com/jackyshan/7a084291a03ae55815631697be1ae995

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末命斧,一起剝皮案震驚了整個(gè)濱河市田晚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌国葬,老刑警劉巖贤徒,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汇四,居然都是意外死亡接奈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)通孽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)序宦,“玉大人,你說(shuō)我怎么就攤上這事利虫“ず瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵糠惫,是天一觀的道長(zhǎng)疫剃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硼讽,這世上最難降的妖魔是什么巢价? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上壤躲,老公的妹妹穿的比我還像新娘城菊。我一直安慰自己,他們只是感情好碉克,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布凌唬。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上系草,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音更耻,去河邊找鬼。 笑死捏膨,一個(gè)胖子當(dāng)著我的面吹牛秧均,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号涯,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼目胡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诚隙?” 一聲冷哼從身側(cè)響起讶隐,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎久又,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體效五,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡地消,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畏妖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脉执。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖戒劫,靈堂內(nèi)的尸體忽然破棺而出半夷,到底是詐尸還是另有隱情,我是刑警寧澤迅细,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布巫橄,位于F島的核電站,受9級(jí)特大地震影響茵典,放射性物質(zhì)發(fā)生泄漏湘换。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彩倚。 院中可真熱鬧筹我,春花似錦、人聲如沸帆离。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哥谷。三九已至岸夯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呼巷,已是汗流浹背囱修。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留王悍,地道東北人破镰。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像压储,于是被迫代替她去往敵國(guó)和親鲜漩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)集惋、插件孕似、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評(píng)論 4 61
  • 韻達(dá)小哥是我合作最久的一個(gè)小哥,他不多話刮刑,冬天穿明黃色厚棉衣喉祭,黑色直筒褲,姜黃色馬丁靴雷绢,格子圍巾泛烙。經(jīng)常一身寒氣,我...
    3e6dbf276266閱讀 172評(píng)論 0 0
  • 第二課 仁慧 人是一種頗為復(fù)雜的動(dòng)物翘紊,所以寫(xiě)人記事的文章大多并非僅僅為介紹某個(gè)人或者敘述某件事蔽氨,而是要表達(dá)作者的某...
    田源ty閱讀 2,785評(píng)論 0 0