2

使ってきました

NSMutableData* mutableData = [NSMutableData dataWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
CGContextRef context = CGBitmapContextCreate(bitmapData,...);
// ...use context
CGContextRelease(context);

自動解放プールを配置していますが、Instruments でこれを見ると、mutableData割り当てが解除されていないようです。以下のように/
を使用することを考えましたが、送信してもパージされるかどうかはわかりません。 allocinitreleasebitmapData

NSMutableData* mutableData = [[NSMutableData alloc] initWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
[mutableData release];
//...

NSMutableDataここでの適切な使用方法は何ですか?

andNSMutableDataの代わりに使用すると自動解放されるので便利だと思いました。しかし、今はそれが本当かどうかわかりません。malloc()free()

4

2 に答える 2

1

mutableDataが割り当て解除されていないようだと言うとき、それは の時点でのCGContextRelease()ことですか、それとも決して割り当て解除されず、これを実行するたびにリークすることを意味しますか?

mutableData最初の例では、自動解放プールが空になるまで (通常はイベント ループの最後に) 割り当てを解除することは期待できません-dataWithLength:mutableData2番目の例では、リリースされるかどうかは未定義です。への呼び出し-mutableBytesは保持と自動解放を適用して、イベントループの残りの部分でポインターが有効であることを確認する場合があります (これはこれらの種類のメソッドではかなり一般的です)。後で使用しますbitmapData

mutableDataリークが発生した場合は、他の場所に保持しすぎている可能性があります。

于 2011-02-04T15:03:52.077 に答える
0

NSMutableData のインスタンスにその mutableBytes を要求すると、それが管理する既存の (既に割り当てられた) バッファーへのポインターが返されます。管理の観点からは、メモリに影響はありません。

したがって、最初の例では、インストルメントで見ると mutableData が割り当て解除されていないように見えるという事実は、その時点での自動解放プール環境に関連している可能性があります。そのように mutableData を使用するコードには NSAutoreleasePool が配置されていますか? コンソールに「autorelease called with no pool in place; just leaking」のような警告が表示されますか? その場合は、コードを次のようにラップするだけです。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// bitmap drawing code here
[pool drain];

2 番目のサンプルでは、​​NSMutableData インスタンスで alloc/init を使用できますが、mutableBytes から取得したポインターを使用した後に解放する必要があります。release を呼び出した後、ポインターは解放された (解放された) メモリを指し、それにアクセスすると恐ろしい EXC_BAD_ACCESS が発生します。

また、malloc/free を使用することは、メモリがいつどのように割り当てられ、いつ解放されるかについて非常に明確になるため、おそらくここでの最初の選択肢になるでしょう。NSMutableData + autorelease は、オブジェクトを他の目的で使用していない場合、オーバーヘッドを除いて実際には何も購入しません。

于 2011-02-04T15:03:54.557 に答える