func connect(host: String, port: Int)
{
self.host = host
self.port = port
NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputStream, outputStream: &outputStream)
if inputStream != nil && outputStream != nil
{
// Set delegate
inputStream!.delegate = self
outputStream!.delegate = self
// Schedule
inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
// Open!
inputStream!.open()
outputStream!.open()
}
}
当我在XCode Simulator中启动上面的代码时,它可以工作,但是当我在iPhone上启动它时,它会给我以下错误:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [NSStream getStreamsToHostWithName:port:inputStream:outputStream:]:无法识别的选择器发送到类0x3b81786c'
答案 0 :(得分:3)
getStreamsToHostWithName(_:port:inputStream:outputStream:)
中的{p> NSStream
。它已在iOS 8中引入。
extension NSStream {
@availability(iOS, introduced=8.0)
class func getStreamsToHostWithName(hostname: String, port: Int, inputStream: AutoreleasingUnsafeMutablePointer<NSInputStream?>, outputStream: AutoreleasingUnsafeMutablePointer<NSOutputStream?>)
}
您必须改为使用CFStreamCreatePairWithSocketToHost
:
class Connection: NSObject, NSStreamDelegate {
var inputStream:NSInputStream?
var outputStream:NSOutputStream?
func connect(host: String, port: Int) {
var inStreamUnmanaged:Unmanaged<CFReadStream>?
var outStreamUnmanaged:Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, host, UInt32(port), &inStreamUnmanaged, &outStreamUnmanaged)
inputStream = inStreamUnmanaged?.takeRetainedValue()
outputStream = outStreamUnmanaged?.takeRetainedValue()
if inputStream != nil && outputStream != nil {
// Set delegate
inputStream!.delegate = self
outputStream!.delegate = self
// Schedule
inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
// Open!
inputStream!.open()
outputStream!.open()
}
}