Objective-C로 작성된 GCDAsyncSocket을 사용하는 Swift에서 프레임 워크를 작성합니다.대리자가 설정되지 않음
I 수신하고 오류 : I는, init 메소드의 대리인 (아래 참조)를 설정하려고 또한 초기화 후 setDelegate 방법을 사용하여 설정을 시도
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.}
.
디버깅 중에 setDelegate 코드가 호출되고 (self
) 전달 된 값에 실제로 참조가 포함되어 있는지 확인했습니다.
업데이트 : GCDAsyncSocket.m을 수정하여 대리자 선언에서 __weak
키워드를 제거하면 작동하지만, 왜 그렇게해야하는지 이해할 수 없습니다. , __weak id delegate
클래스 문제 일으키는 여기
id delegate
변경 : 라인였다이 (다른 대리인 시나리오에 적용도 가능) GCDAsyncSocket 및 SWIFT 코드 내부 위임에 문제가
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에 의해 해제되지 않습니다. – galrito
그 일은 일어난 것처럼 들리지만, var 소켓의 Server.swift에 의해 유지되어야합니다. – picciano
저는 GCDAsyncSocket에 익숙하지 않지만 클래스의 헤더를 보았습니다. 그리고 대리자 속성은 weak로 선언되어 있기 때문에 유지되지 않습니다. – galrito