在视图控制器中调用setReachabilityStatusChangeBlock时,以下代码会引发EXC_BAD_ACCESS异常。我很确定发生的事情是在执行块时不再引用self对象。在代码块中提供自我引用的正确方法是什么?
在下面的示例代码中,注释掉self.description代码可以使其正常工作。 (注意:我在Xcode 6 beta 4上)
AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock{(status: AFNetworkReachabilityStatus?) in
switch status!.hashValue{
case AFNetworkReachabilityStatus.NotReachable.hashValue:
println("Not reachable")
case AFNetworkReachabilityStatus.ReachableViaWiFi.hashValue , AFNetworkReachabilityStatus.ReachableViaWWAN.hashValue :
println("Reachable")
println(self.description) // Seems to cause error
default:
println("Unknown status")
}
}
答案 0 :(得分:3)
我在基于RestKit的项目中尝试使用AFNetworking可访问性代码时遇到了同样的问题。显然,正如OP注意到的那样,当执行块时,self不再可用于参考。我已经将包含可达性代码的类设置为单例,因此我引用了单例共享实例,而不是引用self,它可以工作。
以下是单例设置代码:
class var sharedInstance: MyClass {
struct Static {
static let instance = MyClass()
}
return Static.instance
}
我现在可以将共享实例引用为:
MyClass.sharedInstance
因此,使用该模式,您可以将块更新为以下内容,它应该可以工作:
AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock{(status: AFNetworkReachabilityStatus?) in
switch status!.hashValue{
case AFNetworkReachabilityStatus.NotReachable.hashValue:
println("Not reachable")
case AFNetworkReachabilityStatus.ReachableViaWiFi.hashValue , AFNetworkReachabilityStatus.ReachableViaWWAN.hashValue :
println("Reachable")
println(MyClass.sharedInstance.description) // Seems to cause error
default:
println("Unknown status")
}
}