現象
通信時にNSStreamEvent.ErrorOccurred が発生して
ErrorOccurred: Optional("Error Domain=NSPOSIXErrorDomain Code=12 \"Cannot allocate memory\"")
というメッセージが表示される /** ストリームの状態が変化した時に呼ばれる */
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
switch eventCode {
case NSStreamEvent.ErrorOccurred:
// ここ
print("input: ErrorOccurred: \(aStream.streamError?.description)")
// case XXXX
}
}
対処法
今回のケースはNSStream.removeFromRunLoop を読んでいなかったのが直接の原因でした
// 接続処理
func connect() {
var readStream : Unmanaged<CFReadStream>?
var writeStream : Unmanaged<CFWriteStream>?
// ソケット作成
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, Settings.serverAddress(), serverPort, &readStream, &writeStream)
// すでに接続済みの場合は一旦解除する
if( inputStream != nil ) {
inputStream.delegate = nil
inputStream.close()
// 以下が抜けていた
inputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
}
inputStream = readStream!.takeRetainedValue() as NSInputStream
inputStream.delegate = self
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
}