iOS版本兼容-8.4.1-tableViewCell側(cè)滑崩潰閃退的問(wèn)題

前言

昨天加班,本來(lái)順順利利的,后來(lái)測(cè)試拿了一個(gè)6P來(lái)測(cè),裝的是8.4.1的系統(tǒng),我心說(shuō)真牛,這么老的系統(tǒng)還留著,測(cè)試說(shuō),就怕有些用戶(hù)不更新,就喜歡這個(gè)版本.本來(lái)也沒(méi)有什么大不了,可沒(méi)想到測(cè)出來(lái)的BUG讓我嚇了一跳,特此記錄一下.

  • 1.在8.4.1版本上側(cè)滑沒(méi)有出現(xiàn)刪除按鈕
  • 2.在8.4.1版本上側(cè)滑之后返回上個(gè)界面pop的時(shí)候程序閃退(注:進(jìn)入需要?jiǎng)h除的界面之后,如果對(duì)表格沒(méi)有點(diǎn)擊操作,沒(méi)有右滑刪除操作,返回上個(gè)界面是沒(méi)有崩潰的,??,其實(shí)這里應(yīng)該看出來(lái)的)
一,首先在最新的版本iOS11上沒(méi)有出現(xiàn)此類(lèi)情況,在其他版本應(yīng)該也沒(méi)有出現(xiàn)此類(lèi)情況,不然測(cè)試就找我了.

我首先查看了我調(diào)用的API是否在iOS8中有沒(méi)有,

 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 1)//new
    {
        return YES;
    }

    return NO;
}

-(nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{}

NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED

這個(gè)API注明iOS8以后可以使用,在watchOS 中禁用.按道理來(lái)說(shuō)應(yīng)該沒(méi)錯(cuò),但是沒(méi)有道理可講,在8上側(cè)滑沒(méi)有反應(yīng).然后我就查了一下,大佬們說(shuō)這是因?yàn)槭裁碽alabala,加上

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{}

加上這段代碼,什么都不用寫(xiě),然后就可以了.我試了一下,居然真的可以,真是石樂(lè)志.(應(yīng)該是iOS8中在低版本會(huì)先調(diào)用這個(gè)方法,然后再去走新的方法,不懂)

二,這個(gè)Bug就比較雞賊了,閃退的時(shí)候沒(méi)有崩潰的提示信息,直接到了 main 函數(shù)里,搜索的時(shí)候,看到大佬說(shuō)的話,一般直接跳到main函數(shù)里的并且不打印任何日志的崩潰應(yīng)該和內(nèi)存有關(guān)系.謝謝

對(duì)了,因?yàn)橛X(jué)得API會(huì)影響,所以我把

-(nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{}
注釋了,實(shí)現(xiàn)了

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (editingStyle ==UITableViewCellEditingStyleDelete) {
        [self removeAction:indexPath.row];//這個(gè)方法進(jìn)行刪除數(shù)組元素,刷新列表的操作
    }
}

接下來(lái)要做的事情,通過(guò)xcode自帶的僵尸方法,檢查,怎么打開(kāi)呢,

請(qǐng)按著command+shift+< ,看截圖
打開(kāi)僵尸對(duì)象檢查方法.png
第二個(gè)方法,開(kāi)著比不開(kāi)強(qiáng),我覺(jué)得 可以追蹤內(nèi)存來(lái)源

保存后,重新運(yùn)行程序,再重復(fù)之前的操作,bug 出現(xiàn)了,右下角也有打印出日志了,問(wèn)題如下:

2017-12-25 10:13:05.194 xx寶[1621:124805] *** -[STrustDeviceManagerViewController tableView:canEditRowAtIndexPath:]: message sent to deallocated instance 0x158aedfc0

搜索之后發(fā)現(xiàn),有人早在幾年前就遇到了這個(gè)問(wèn)題,一下內(nèi)容大部分為原文來(lái)自

startong的博客

也就是說(shuō),tableView:canEditRowAtIndexPath 這個(gè)方法有問(wèn)題,那我就納悶兒了,這個(gè)方法怎么可能會(huì)有問(wèn)題,難怪我之前注釋掉了這個(gè)方法就沒(méi)問(wèn)題了,果然是這里有問(wèn)題,知道了問(wèn)題針對(duì)它解決掉也就不會(huì)是什么難事兒了,我初步懷疑是 return YES 的問(wèn)題,

于是,我在函數(shù)里加了這樣幾行代碼

  • -(void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [self.bgTableView setEditing:NO];
    }

然后再重新運(yùn)行,重復(fù)之前的操作,問(wèn)題解決了,perfect,,,,

雖然問(wèn)題解決了,但是還是覺(jué)得,canEditRowAtIndex 這個(gè)方法應(yīng)該不會(huì)有問(wèn)題,于是我再 ios 6 的模擬器下運(yùn)行程序,重復(fù)操作沒(méi)問(wèn)題(當(dāng)然注釋掉viewWillDisappear 方法),后來(lái)到網(wǎng)上找了好多資料,很大神都說(shuō)可能是蘋(píng)果自身的問(wèn)題,ios7 才有這個(gè)問(wèn)題,ios6 以及以下不會(huì)出現(xiàn)這種問(wèn)題,

至此,問(wèn)題得到解決,以上列出了兩種解決方案:
1,刪掉canEditRowAtIndexPath這個(gè)方法不用,不會(huì)出問(wèn)題;(PS : 這個(gè)不行,我的表格里面第二個(gè)區(qū),才能進(jìn)行刪除操作,而且里面還有一行不能刪除,這個(gè)方法可以用,但是要看你的實(shí)際需求了.)

2,加上上面說(shuō)的 viewWillDisappear 方法也可以解決問(wèn)題;但是我個(gè)人推薦第二種方法,雖然第一種方法也是可以解決問(wèn)題的,但是個(gè)人還是覺(jué)得這兩個(gè)方法配套使用比較好。

最終總結(jié)

最終總結(jié)出問(wèn)題 可能是在 canEditRowAtIndexPath 這個(gè)方法里設(shè)置了YES然后返回的時(shí)候沒(méi)有把它設(shè)置成 NO 所以報(bào)錯(cuò),ios6會(huì)自動(dòng)設(shè)置成NO,iOS7 就手動(dòng)設(shè)置成 NO也可以。所以以后無(wú)論什么版本,我們都加上viewWillDisappear手動(dòng)設(shè)置 editing 這個(gè)屬性為NO 這樣確保萬(wàn)無(wú)一失。

插一句,在iOS9以上沒(méi)有這個(gè)問(wèn)題,估計(jì)是蘋(píng)果也處理了這個(gè)問(wèn)題,在界面釋放的時(shí)候,自動(dòng)設(shè)置為NO,所以能升級(jí)就趕緊升級(jí),不要讓程序猿痛苦了.
如果對(duì)你有用,請(qǐng)為我點(diǎn)個(gè)贊,留個(gè)念.謝謝了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容