現象
通信時に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() }