iOSでNSStreamを使用した時にCannot allocate memoryが発生する(Swift2)

Streamを正しく使えていないのが原因かと





現象



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


2016年9月17日土曜日