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

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





現象



通信時にNSStreamEvent.ErrorOccurred が発生して

ErrorOccurred: Optional("Error Domain=NSPOSIXErrorDomain Code=12 \"Cannot allocate memory\"")
というメッセージが表示される

1
2
3
4
5
6
7
8
9
10
/** ストリームの状態が変化した時に呼ばれる */
 func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
 
         switch eventCode {
         case NSStreamEvent.ErrorOccurred:
             // ここ
             print("input: ErrorOccurred: \(aStream.streamError?.description)")
         // case XXXX
         }
}



対処法



今回のケースはNSStream.removeFromRunLoop を読んでいなかったのが直接の原因でした

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 接続処理
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日土曜日