【问题标题】:EXC_BAD_ACCESS when accessing a String property访问字符串属性时的 EXC_BAD_ACCESS
【发布时间】:2015-01-27 12:14:01
【问题描述】:

Crashlytics 称有几起崩溃是随机发生的。

请考虑以下代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("NewsfeedItemCell", forIndexPath: indexPath) as NewsfeedItemTableViewCell

    let newsfeedItem = self.newsfeedItems[indexPath.row]

    // This line gives crash: EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000000000000
    let text = newsfeedItem.text as NSString
    cell.descriptionLabel.text = text

    return cell
}

这里是NewsfeedItem类:

class NewsfeedItem: NSManagedObject {

    @NSManaged var date: NSDate
    @NSManaged var sku: String
    @NSManaged var text: String

    var dataItem: DataItem?

}

PS:请注意NewsfeedItem.text 属性不是可选的,所以它不能是nil!

【问题讨论】:

  • 很可能您在访问文本时访问的是 nil。尝试使用可选的 if 语法 if (let text = newsfeedItem.text) {//Your code}
  • self.newsfeedItems..??
  • 这怎么可能? text 不是 Optional
  • 即使对于可选的 Core Data 属性,Xcode(不幸的是)也会生成一个非可选的 Swift 属性(所以如果没有设置 Core Data 属性,它可以为 nil!) .请参阅Check if property is set in Core Data? 了解可能的解决方法。
  • @MartinR,这更接近答案,谢谢!会试试的

标签: ios swift exc-bad-access


【解决方案1】:

您确定您的 NewsfeedItem 文本不是 nil 吗?如果你不先检查它

if let text = newsfeedItem.text as? NSString{
    cell.descriptionLabel.text = text
}

【讨论】:

  • 我为什么要解开非可选值?
  • @AndreyGordeev 如果选中了可选复选框并且未设置默认值,请在数据模型检查器中检查您的文本属性
【解决方案2】:

我对 swift 没有任何想法。 但异常清楚地表明它是关于访问非字符串值。这意味着您正在访问一个 nil 对象或不同的字符串对象。

可能self.newsfeedItems 是NewsfeedItem 的对象,因此您正试图访问它的(iVar)字符串。

【讨论】:

  • self.newsfeedItems 是 Newsfeed 项的数组。 Swift 中的 AFAIK,如果我声明这样的属性:var text: String 它不能采用 nil 值
  • newsfeedItem 明确地将其设为NewsfeedItem 的对象,然后尝试......类似let newsfeedItem as NewsfeedItem
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多