解析对象EXC_BAD_ACCESS

时间:2015-08-13 14:47:21

标签: ios swift parse-platform

我的解析有问题。我在Event和Type之间的数据库中有关系。所以,事件有它的类型,包括标题和颜色(和其他属性,但关注关系) 事件:

@NSManaged var type: Type

另外,我有计算机属性eventColor:

var eventColor: UIColor{
return type?.typeColor ?? UIColor.clearColor()
}

基本查询:

override class func query() -> PFQuery? {
    //1
    let query = PFQuery(className: Event.parseClassName())
    //2
    query.includeKey("type")
    //3
    query.orderByDescending("startDate")
    return query
}

控制器:

var events = [Event](){
    didSet { eventsTableView.reloadData()  }
}

我正在提出要求:

query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
    self.activityIndicator.stopAnimating()
    if let objects = objects as? [Event] where error == nil{
        println("Count is: \(objects.count)")
        for event in objects{ 
            event.pinInBackground()
            println("\(event.type)") //Here, type is available... and it prints out
        }
        self.events = objects // Property observer is called
    }
    else{

        println("Handle error...")
    }
})

在表视图重新加载后调用的代码:

tableView cellForRow....(){
    let event = self.events[indexPath.row]
   let color = event.eventColor // BAD ACCESS, because "type"    dissappears.   
 }

因此,在发出此请求并在视图控制器中将数组事件分配给数组之后,我正在尝试读取计算机属性事件颜色并且它失败(EXC_BAD_ACCESS)。似乎类型对象在块中可用,它在获取事件后执行,但后来它消失了,每次我想读它时,我都有应用程序运行时错误。 我不知道,感觉对象在块中保持像弱(因为我包括“includeKey”和类型被下载),但后来它只是立即解除分配。我应该怎么做,以防止解除分配类型?我可以创建自己的Type对象,而不是PFObject的子类,但我相信在某个地方应该有另一种更清洁的方式。

谢谢

编辑: 好的,所以我发现了更多的调查(cellForRow ......) 我试图通过下标PFObject获取类型和它的颜色属性:

let typeItem = eventItem["type"] as! PFObject
println("type is: \(typeItem)")
/*
type is: <Type: 0x7fe99bdf3330, objectId: dkEXw2r7zh, localId: (null)> {
    color = "#F29C31";
    name = swift;
}
*/
let colorFromType = typeItem["color"]
println("color: \(colorFromType)") //Works, returns valid value.

但是以其他方式写作:

let type = eventItem.type
let color = type?.color //Compiles, but runtime error:
'NSInvalidArgumentException', reason: '-[PFObject color]: unrecognized     selector sent to instance 0x7fe99bdf3330'
println("type: \(type), color: \(color)")

所以我不完全确定,为什么会这样。看起来Event的这个类型属性无法转换为Type,但我确定这是属性类型。

编辑,决议: 好吧,我是如此愚蠢,我不知道注册子类,Type.registerSubclass解决了所有问题。

1 个答案:

答案 0 :(得分:0)

听起来你需要在tableView cellForRow....()调用中对该对象进行类型转换。

如果没有演员,您对.eventColor的来电将失败,而且就我所见,演员表未保存到self.events。试试这个:

tableView cellForRow....(){
   let event = self.events[indexPath.row] as! Event
   let color = event.eventColor 
}

此外,如果您使用的是子类,则需要确保提前使用registerSubclass,否则您的属性将无法使用!