2013-05-01 18 views
6

私はNSInputstream & NSOutputstreamを使用して接続を確立し、データを送信します。私のストリームオブジェクトには、ストリームを開いたり閉じたりする機能があります。私は次のコードを使用します:CFStreamCreatePairWithSocketToHostのメモリリークiOS

このコードは、ストリームを何度も開いて閉じるとうまく動作します。 Instrumentsでメモリリークのアプリケーションをチェックすると、関数CFStreamCreatePairWithSocketToHostがメモリを72%リークしていると言われています。誰かが私が間違っていることを知っていますか?私はそれを理解することはできません。

答えて

11

の方法でCFRelease((CFStreamRef)inputStream);CFRelease((CFStreamRef)outputStream);を追加します。

CFStreamCreatePairWithSocketToHost戻り、readStreamwriteStreamの所有権があなたに渡されます。この行を変更し、代わりに

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). 

:ARCを使用した場合

Ownership follows the Create Rule in Memory Management Programming Guide for Core Foundation. 

Core Foundationのオブジェクトを明示的にも解放する必要があります(対応するoutputStreamの行):

inputStream = (__bridge NSInputStream *)readStream; 

:readStreamは、ARCは認識していない優れた保持カウントを持っているので、

inputStream = (__bridge_transfer NSInputStream *)readStream; 

はこれがあります。 ARCにこのポインタの所有権を与えることで、適切な時点でポインタを解放する権限をARCに与えています。さらに読む:12

+0

私は自分のプロジェクトで自動参照カウントを使用しているので、私はリリースを使用できません。それは私のために自動的に行われますか? –

+0

私の更新を確認してください – Mar0ux

+0

それは働いた!メモリリークはもう発生しません。あなたの答えはNSStringの代わりにNSInputStreamを意味すると思いますか? –