引用self时,AFNetworkReachabilityManager EXC_BAD_ACCESS在swift中

时间:2014-07-22 04:02:42

标签: swift afnetworking

在视图控制器中调用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")
        }
}

1 个答案:

答案 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")
    }
}