iOS 控制器被釋放了定時器卻還在執(zhí)行其中方法的bug

先貼上此場景中的三處代碼(此代碼已解決該bug)仔戈,場景及方法為中間注釋部分:

//輪播圖中的代理方法
- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel {
    //翻頁指示器
    self.pageControl.currentPage = carousel.currentItemIndex;
    //每次翻頁改變時寻馏,就重置定時器
    [self timerFire];
}
#pragma mark 定時器啟動

- (void)timerFire
{
    [self.timer invalidate];
    /**
    *   這里用_portrait來間接判斷self是否被釋放篇恒,原因如下:
    *   此處發(fā)現(xiàn)一個bug媒咳。
    *   當(dāng)前界面為A,這處代碼也都在A界面中使碾, 從A push界面B蜜徽,在B中發(fā)網(wǎng)絡(luò)請求添加了驗證當(dāng)網(wǎng)絡(luò)請求返回code=-2時,在B中popToRootViewController 然后切換根視圖票摇,
    *   控制器A還沒來得及銷毀拘鞋,A中輪播圖滾動時觸發(fā)方法[carouselCurrentItemIndexDidChange:]中的方法[self timerFire],
    *   執(zhí)行完 timerFire方法中的 [self.timer invalidate]后矢门,立馬進入dealloc方法盆色,銷毀對象,
    *   再接著執(zhí)行 timerFire方法中的 [self.timer invalidate]后面的方法 __weak typeof(self) weakSelf = self;
    *   但是此時 self已經(jīng)是被銷毀的對象祟剔,(注意:雖然self被銷毀傅事,但它此時還不為空!因此此時不能在程序中使用self峡扩,否則會報對象已被釋放的地址錯誤。但是通過觀察控制臺障本,self中的對象_portrait等已經(jīng)被釋放為空了教届。)
    *   在百度了兩種方法之后(后面介紹)响鹃,都不可行,因為此時程序中不能使用self案训,也就不能使用 self.portrait买置,但是我發(fā)現(xiàn),可以使用 _portrait 强霎,
    *   (self.portrait是先調(diào)用getter方法獲值忿项,而_portrait是直接訪問對象的內(nèi)存地址來獲值)
    *   因此,使用_portrait 判斷 _portrait是否為空城舞,來間接判斷 self是否被釋放轩触。(_portrait是viewDidLoad中創(chuàng)建的全局屬性,只要self沒被銷毀家夺,_portrait就不會為nil)脱柱。
    */
    if (_portrait) {
        __weak typeof(self) weakSelf = self;
        self.timer = [NSTimer bk_scheduledTimerWithTimeInterval:4 block:^(NSTimer *timer) {
            [weakSelf.carousel scrollToItemAtIndex:_carousel.currentItemIndex+1 animated:YES];
        } repeats:YES];
    }
}
- (void)dealloc {
    [self.timer invalidate];
    BLYLogDebug(@"銷毀 PersonalInfoVC");
}
下面說一下我百度到的兩種方法

1. 取消performSelector執(zhí)行的方法

問:我有一個對象mytablecontroller,它有一個線程隊列queue拉馋,每次需要請求table的數(shù)據(jù)的時候就添加一個operation去訪問web榨为,再performSelectorOnMainThread進行reloadtable。然而很有可能mytablecontroller在執(zhí)行reloadtable方法前煌茴,用戶就執(zhí)行了導(dǎo)航切換了(navigationController popToViewController)随闺。這時mytablecontroller被release了,而operation子線程還在繼續(xù)執(zhí)行蔓腐,于是reloadtable就EXC_BAD_ACCESS了矩乐。我想給reloadtable添加一個判斷,判斷一下self.table是否被釋放合住。請問我應(yīng)該怎么做绰精?if(self.table!=nil)我試過了,行不通透葛,因為即使release了也不意味著就nil了笨使。

有人回答: mytablecontroller這個類的dealloc方法里面,要cancel這個queue

所以我想起了使用 performSelector: 去調(diào)用方法是可以調(diào)用cancelPreviousPerformRequestsWithTarget:selector:object:取消的僚害,詳情見此文 iOS: NSObject中執(zhí)行Selector的相關(guān)方法
試驗后發(fā)現(xiàn)不行硫椰,我覺得可能是因為要用延時afterDelay才有效果performSelector:withObject:afterDelay:

2. 如何檢測一個對象被釋放

關(guān)于這個問題,我百度和stackoverflow上都沒有找到可靠的答案萨蚕,現(xiàn)在來求助各位大神靶草。
網(wǎng)上普遍提到的一種方法是使用如下方式:

UIView *myView = [[UIView alloc] init];
    Class oldClass = object_getClass(myView);
    [myView release];
    Class newClass = object_getClass(myView);
    if(oldClass == newClass){
        //not released
    }
    else {
        //released
    }

在iOS8.3上測試可用,在iOS6和iOS7測試都不可用

但是 我在注釋的場景中說了岳遥,這個對象當(dāng)前控制器self奕翔,而不是self中的屬性,dealloc后不能再程序中使用self浩蓉,所以此思路也無法使用派继。

總結(jié):

這個bug是在界面A push界面B宾袜,在B中發(fā)請求添加了驗證token=-2要退出切換根視圖時才遇到的,可能是我用定時器控制輪播圖滾動的邏輯不太好驾窟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庆猫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绅络,更是在濱河造成了極大的恐慌月培,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩急,死亡現(xiàn)場離奇詭異杉畜,居然都是意外死亡,警方通過查閱死者的電腦和手機假栓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門寻行,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匾荆,你說我怎么就攤上這事拌蜘。” “怎么了牙丽?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵简卧,是天一觀的道長。 經(jīng)常有香客問我烤芦,道長举娩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任构罗,我火速辦了婚禮铜涉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘遂唧。我一直安慰自己芙代,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布盖彭。 她就那樣靜靜地躺著纹烹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪召边。 梳的紋絲不亂的頭發(fā)上铺呵,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音隧熙,去河邊找鬼片挂。 笑死,一個胖子當(dāng)著我的面吹牛贞盯,可吹牛的內(nèi)容都是我干的宴卖。 我是一名探鬼主播滋将,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼症昏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起父丰,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肝谭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛾扇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攘烛,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年镀首,在試婚紗的時候發(fā)現(xiàn)自己被綠了坟漱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡更哄,死狀恐怖芋齿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情成翩,我是刑警寧澤觅捆,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站麻敌,受9級特大地震影響栅炒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜术羔,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一赢赊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧级历,春花似錦释移、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扛禽,卻和暖如春锋边,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背编曼。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工豆巨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掐场。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓往扔,卻偏偏與公主長得像贩猎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萍膛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉吭服,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評論 30 470
  • 去年(2015年)年末的時候,我在壹咖啡遇到過一位大叔蝗罗。 目測40多歲艇棕,發(fā)福的身材,油光可鑒的面龐串塑,手提公文包沼琉,儼...
    努力的陳小白閱讀 242評論 0 2
  • 書單收藏了一大推,亞馬遜和當(dāng)當(dāng)網(wǎng)上各大圖書榜單也瀏覽了不下十次桩匪,微信打瘪、微博、簡書上凡是有關(guān)“如何挑書”傻昙、“如何讀...
    lily不著名閱讀 328評論 0 1
  • 一闺骚、人類為什么要爭斗? 在沒有長矛屋匕、槍炮葛碧、炸彈的為動物世界中,暴力的基本形式—— 動物之所以要爭斗过吻,原因在于 1进泼、...
    程宇A(yù)lex閱讀 570評論 0 0