Add CFRelease((CFStreamRef)inputStream);
and CFRelease((CFStreamRef)outputStream);
in the streamClose
method.
When CFStreamCreatePairWithSocketToHost
returns, ownership of readStream
and writeStream
is passed onto you:
Ownership follows the Create Rule in Memory Management Programming Guide for Core Foundation.
Core Foundation objects need to be explicitly released even when using ARC:
The compiler does not automatically manage the lifetimes of Core Foundation objects; you
must call CFRetain and CFRelease (or the corresponding type-specific variants) as dictated
by the Core Foundation memory management rules (see Memory Management Programming Guide
for Core Foundation).
Alternatively, change this line (and corresponding line for outputStream
):
inputStream = (__bridge NSInputStream *)readStream;
to:
inputStream = (__bridge_transfer NSInputStream *)readStream;
This is because readStream has an outstanding retain count which ARC is not aware of. By giving ARC the ownership of this pointer, you are giving it permission to release the pointer at appropriate time. Further reading: 1, 2