使用バイトのNSMutableDataインスタンスができるとこautoreleased
-
28-10-2019 - |
質問
まとめ
NSMutableData* mutableData = [NSMutableData dataWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
CGContextRef context = CGBitmapContextCreate(bitmapData,...);
// ...use context
CGContextRelease(context);
いautoreleaseプールの場ですが、この点についてもう少し楽器 mutableData
るという割.
と思ったの alloc
/init
以下のようなものだけを送信する場合は release
うーパージ bitmapData
しています。
NSMutableData* mutableData = [[NSMutableData alloc] initWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
[mutableData release];
//...
どの適切な使用 NSMutableData
いので、これから
思用 NSMutableData
の代わりに malloc()
や free()
いので便利になるでしょうautoreleased.が現地に行っています。
解決
あなたが言う時 mutableData
扱われていないようです、あなたはその時点で意味しますか CGContextRelease()
, 、または、それが決して扱われず、これを実行するたびに漏れることを意味しますか?
あなたの最初の例では、あなたは期待しないでしょう mutableData
あなたが使用したので、オートレリーズプールが排出されるまで(通常はイベントループの終わりに)扱うために -dataWithLength:
. 。 2番目の例では、定義されていません mutableData
リリースされます。通話 -mutableBytes
ポインターがイベントループの残りの部分に有効であることを確認するために、保持と自動エレベリーズを適用する可能性があります(これはこれらの種類の方法ではかなり一般的です)が、ドキュメントは言っていないため、2番目の例は使用している場合は未定義の動作です bitmapData
後で。
今if mutableData
漏れ、それからあなたはそれをどこか他の場所で過剰に保持している可能性があります。
他のヒント
かのインスタンスNSMutableDataそのmutableBytesだけでポインタを返し、既存の(割り当て済みバッファで管理します。ないとして動作するときにのみ有効にメモリーからマネージメントの視点
そこで最初の例では、こmutableDataが表示されていないする割合で商品に関連している可能性があるautoreleaseプール環境です。のコードを使用mutableDataこのようにしてNSAutoreleasePoolか。いま警告のコンソールのように"autoreleaseというのないプール。で漏れ"?その場合する必要がありますが、すぐにラップのコード:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// bitmap drawing code here
[pool drain];
第二サンプルを使用できるalloc/initのNSMutableDataインスタンスができれば同日公表されることとなったのを使ってのポインターからmutableBytes.のポインタが指割(解放された)メモリの呼び出した後リリース、アクセスすることができない、恐ろしいEXC_BAD_ACCESS.
また、malloc/無料であろうが自分にとっては、最初の選択肢ここで、非常に明確などのメモリの割り当てと解放されます。NSMutableData+autorelease最初がやりたかっただけで買いものを除くオーバーヘッドでない場合にオブジェクトいただけます。