【发布时间】:2014-07-18 12:12:55
【问题描述】:
我正在用 Swift 构建一个框架,它使用用 Objective-C 编写的 GCDAsyncSocket。
我收到的错误是:
Couldn't start socket: Error Domain=GCDAsyncSocketErrorDomain Code=1 "Attempting to accept without a delegate. Set a delegate first." UserInfo=0x61000026b940 {NSLocalizedDescription=Attempting to accept without a delegate. Set a delegate first.}
我已经尝试在 init 方法中设置委托(如下所示),还尝试在初始化后使用 setDelegate 方法进行设置。
在调试时,我已经验证 setDelegate 代码被调用并且传入的值 (self) 实际上包含一个引用。
更新:当我修改 GCDAsyncSocket.m 以从委托的声明中删除 __weak 关键字时,它可以工作,但我仍然不明白为什么我必须这样做。
该行是:__weak id delegate,改为id delegate
这是导致问题的类:
class Server: GCDAsyncSocketDelegate
{
let boundHost:String?
let port:UInt16
var socket:GCDAsyncSocket?
init(boundHost: String?, port: UInt16)
{
if boundHost {
self.boundHost = boundHost!
}
self.port = port
println("Server created with host: \(self.boundHost) and port: \(self.port).")
}
convenience init(port:UInt16) {
self.init(boundHost: nil, port: port)
}
func startServer() -> Bool
{
if !socket
{
socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
}
var error:NSError?
if !socket!.acceptOnInterface(boundHost, port: port, error: &error)
{
println("Couldn't start socket: \(error)")
return false;
}
else
{
println("Listening on \(port).")
return true
}
}
func stopServer() -> Bool
{
if socket
{
socket!.disconnect()
return true
}
return false
}
func socket(sock:GCDAsyncSocket!, didAcceptNewSocket newSocket:GCDAsyncSocket!)
{
println("New socket received: \(newSocket)")
}
}
【问题讨论】:
-
可能是因为没有任何东西保留代理,所以 ARC 从内存中释放它。通过删除
__weak语句,GCDAsyncSocket 保留了委托,并且它不会被 ARC 释放。 -
这听起来像是正在发生的事情,但它应该由 Server.swift 保留在 var socket 中。
-
我对GCDAsyncSocket不熟悉,但是去看了class的header,delegate属性被声明为weak,所以没有保留。
-
您打算将您的框架开源还是在线发布到任何地方?
-
@nsij22 它不完整,但有它。 github.com/picciano/SwiftServe
标签: ios objective-c macos delegates swift