如何避免 tableView(_:cellForRowAt) 中的崩溃?

Posted

技术标签:

【中文标题】如何避免 tableView(_:cellForRowAt) 中的崩溃?【英文标题】:How to avoid crashes in tableView(_:cellForRowAt)? 【发布时间】:2018-09-23 12:39:08 【问题描述】:

在 Fabric 中,我在“tableView(_:cellForRowAt)”部分看到了很多崩溃。这种例外情况没有特定的情况。它可以在任何时间和任何屏幕上发生。没有用于分析崩溃的数据。只有我知道“tableView(_:cellForRowAt)”中有崩溃。

虽然我不知道根本原因,但我想防止这种异常。我可以使用防止 NullPointer Exception (if (!null)) 之类的方法吗?

以下两个不同代码部分的崩溃;

let XXX = Constants.sharedInstance.url+"/service/photo/"+userdas[(indexPath as NSIndexPath).row].id!+"/"+userdas[(indexPath as NSIndexPath).row].photo!+"/2"

self.notificationModel[indexPath.row].userNot.XXX?.XXXImageView = image

【问题讨论】:

请将tableView(_:cellForRowAt) 方法的代码添加到问题中 可能你在你的方法中做了一些显式或隐式的强制解包,这会导致崩溃。添加您的方法的代码,以便我们可以肯定地说。 请附上minimal reproducible example。 不同代码段的两次崩溃; 1- 让 XXX=Constants.sharedInstance.url+"/service/photo/"+userdas[(indexPath as NSIndexPath).row].id!+"/"+userdas[(indexPath as NSIndexPath).row].photo!+ "/2" 2- self.notificationModel[indexPath.row].userNot.XXX?.XXXImageView = image @YuryImashev 我添加了发生崩溃的行。 【参考方案1】:

从您的代码中可以清楚地看出,您正在执行一些可能导致崩溃的显式强制解包。

userdas[(indexPath as NSIndexPath).row].id!

userdas[(indexPath as NSIndexPath).row].photo!

self.notificationModel[indexPath.row].userNot.XXX?.XXXImageView

我猜在第三种情况下XXXImageView 被隐式解包UIImageView 也可能是nil

为了避免第一部分的崩溃,您可以使用guard

guard let id = userdas[indexPath.row].id, 
      let photo = userdas[indexPath.row].photo else 
    return 

let XXX = Constants.sharedInstance.url+"/service/photo/"+id+"/"+photo+"/2"

我不确定您在第二部分中在做什么,但您只需要检查您展开的参数是否也不是 nil

【讨论】:

非常感谢@YuryImashev @AshleyMills 当然!感谢您的建议,答案已更新

以上是关于如何避免 tableView(_:cellForRowAt) 中的崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 heightForRowAt 方法中我的单元格为零?

JSON返回null ios时Tableview崩溃

如何在tableview的单元格内使用uiwebview并避免在重用单元格顶部加载页面[重复]

从 tableView 上的核心数据填充数据时如何避免行重复

iOS如何彻底避免数组越界

当 tableview 使用自动布局滚动时避免粘性标题视图