iOS——記一次block的循環(huán)引用

最近在做的小項目出現(xiàn)了一個問題瞧捌。當presentViewController時內存上升(在debug navigator下觀察)闽寡,dissmissViewController時竟然沒有下降筋夏。我第一反應就是哪里出現(xiàn)循環(huán)引用了。于是我手工遍歷一遍代碼团驱,還好代碼量不是太多构订,很快就找到問題的根源蕾羊。

下文的block其實就是swift中的closure閉包,兩者非常想想帽驯。

問題描述:

有時候為了減少重復代碼龟再,我們會將重復的代碼抽取出去放在一個函數(shù)里面,然后根據(jù)不同參數(shù)來調用該函數(shù)尼变。

    func editAccountBook(item:AccountBookBtn?, indexPath:NSIndexPath, sureBlock:(String, String)->Void){
        customAlertView.title = item?.btnTitle ?? ""
        customAlertView.initChooseImage = item?.backgrountImageName ?? "book_cover_0"
        customAlertView.cancelBlock = {[weak self] in
            if let strongSelf = self{
                strongSelf.customAlertView.removeFromSuperview()
            }
        }
        customAlertView.sureBlock = sureBlock
        UIApplication.sharedApplication().keyWindow?.addSubview(self.customAlertView)
    }

比如上面這個函數(shù)利凑,目光集中在倒數(shù)第二行的sureBlock,這個sureBlock是外部傳進來的嫌术。我們知道Block的原理就是一個結構體哀澈,像函數(shù)傳參這種一般都是傳sureBlock的結構體指針。在使用屬性的時候度气,swift允許我們不加self割按,所以customAlerView是被self引用到的。而只要這個sureBlock里面有對self的強引用磷籍,將sureBlock賦值給customAlerView.sureBlock的話就會造成循環(huán)易用适荣。所以說现柠,抽代碼要小心吶。

再看看editAccountBook這個函數(shù)被調用的地方弛矛,一開始我是這么寫的

    let block:(String,String)->Void = {(title, imageName) in
        //建一個數(shù)據(jù)庫
        let currentTime = Int(NSDate().timeIntervalSince1970)
        let dbName = customAccountName + "\(currentTime)" + ".db"
        let item = AccountBookBtn(title: title, count: "0筆", image: imageName, flag: false, dbName: dbName)
        //插入賬本
        self.mainVCModel.addBookItemByAppend(item)
        self.mainView.accountBookBtnView.insertItemsAtIndexPaths([indexPath])
        //退出alertview
        self.customAlertView.removeFromSuperview()
    }
    editAccountBook(nil, indexPath: indexPath, sureBlock: block)

當時覺得這個block是臨時生成的够吩,里面雖然引用到self,應該也沒什么關系丈氓。殊不知這個block在傳給editAccountBook這個函數(shù)的時候就間接地被self引用到了周循,所以就造成了循環(huán)引用。所以用block真是要特別小心万俗。特別是一些自己寫的函數(shù)湾笛。

解決辦法

解決辦法很簡單,在block的開頭加一些list就好该编。如下

    editAccountBook(nil, indexPath: indexPath){[weak self](title, imageName) in
        if let strongSelf = self{
            //建一個數(shù)據(jù)庫
            let currentTime = Int(NSDate().timeIntervalSince1970)
            let dbName = customAccountName + "\(currentTime)" + ".db"
            let item = AccountBookBtn(title: title, count: "0筆", image: imageName, flag: false, dbName: dbName)
            //插入賬本
            strongSelf.mainVCModel.addBookItemByAppend(item)
            strongSelf.mainView.accountBookBtnView.insertItemsAtIndexPaths([indexPath])
            //退出alertview
            strongSelf.customAlertView.removeFromSuperview()
        }
    }

這里用了swift的省略寫法迄本,當函數(shù)最后一個參數(shù)是block時,可以將整個block移到函數(shù)的末尾课竣〖问辏可以看到這里使用了[weak self],這一句會將selfwrap成一個optional于樟,所以在使用的時候得unwrap公条。其中的if let strongSelf = self就是unwrap∮厍看到這里靶橱,用Objc開發(fā)的同學應該很熟悉了,在ARC下block的寫法和swift里的思想都是一模一樣的路捧,格式有點不同罷了关霸。

自己寫的總結,方便以后查看杰扫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末队寇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子章姓,更是在濱河造成了極大的恐慌佳遣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡伊,死亡現(xiàn)場離奇詭異零渐,居然都是意外死亡,警方通過查閱死者的電腦和手機系忙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門诵盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事拦耐「冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵杀糯,是天一觀的道長扫俺。 經(jīng)常有香客問我,道長固翰,這世上最難降的妖魔是什么狼纬? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骂际,結果婚禮上疗琉,老公的妹妹穿的比我還像新娘。我一直安慰自己歉铝,他們只是感情好盈简,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著太示,像睡著了一般柠贤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上类缤,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天臼勉,我揣著相機與錄音,去河邊找鬼餐弱。 笑死宴霸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的膏蚓。 我是一名探鬼主播瓢谢,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驮瞧!你這毒婦竟也來了氓扛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剧董,失蹤者是張志新(化名)和其女友劉穎幢尚,沒想到半個月后破停,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翅楼,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年真慢,在試婚紗的時候發(fā)現(xiàn)自己被綠了毅臊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡黑界,死狀恐怖管嬉,靈堂內的尸體忽然破棺而出皂林,到底是詐尸還是另有隱情,我是刑警寧澤蚯撩,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布础倍,位于F島的核電站,受9級特大地震影響胎挎,放射性物質發(fā)生泄漏沟启。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一犹菇、第九天 我趴在偏房一處隱蔽的房頂上張望德迹。 院中可真熱鬧,春花似錦揭芍、人聲如沸胳搞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肌毅。三九已至,卻和暖如春列另,著一層夾襖步出監(jiān)牢的瞬間芽腾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工页衙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摊滔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓店乐,卻偏偏與公主長得像艰躺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眨八,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)腺兴、block、GCD廉侧,偏向于從原理上對這些內容...
    WeiHing閱讀 9,810評論 10 69
  • 此人畫渣 第一次畫萌物 第一次使用馬克筆 學習之余的畫 一做完作業(yè)立刻提起畫筆页响,以此釋放我的壓力 第一次畫框 對于...
    萌萌噠喵喵醬閱讀 333評論 3 1
  • 很多人工作了好些年,一直得不到升遷段誊,看著資歷比自己低的已經(jīng)位居高位了闰蚕,心中難免有怨氣,天天在抱怨:老子拼死拼活干得...
    趣昂閱讀 391評論 0 1
  • 2016年國慶连舍,90后的我裸辭了没陡,帶著兩身衣服回到家。做短暫的啃老族,中旬奔赴另一個城市從事其他的行業(yè)崗位盼玄。 現(xiàn)在...
    木筱菱閱讀 569評論 0 0