2

コントローラー文字列データメンバーを呼び出し、UTF8Stringメソッドを使用して NSString オブジェクトを C++ 文字列オブジェクトに変換すると、メモリ リークが発生します。呼び出しはコア オーディオRenderTone関数内で行われ、次のようになります。

InstrumentGridViewController *viewController = (InstrumentGridViewController *)inRefCon;
string cppTrackName = [viewController->trackName UTF8String];

ただし、コードは for ループ内にあり、かなりのメモリ リークを引き起こしています。理由はありますか?変数を使用して C++ 関数呼び出しを行っているため、変換を行う必要がありcppTrackNameます。私もこれを試しました:string cppTrackName = "synthTrack #1";これはリークを引き起こすことなく正常に動作しますが、明らかにコントローラーから値を読み取る必要があります。

これはコンソールのエラーです(常に繰り返されます):

objc[6352]: Object 0x68c3b60 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
4

1 に答える 1

2

アップデート

メッセージを見たので:

の実装は-[NSString UTF8String]、メッセージが作成されたスレッドに自動解放プールが存在することを前提としています。

オーディオ コールバックがセカンダリ (レンダリング) スレッドから呼び出されています。明らかに、文字列にメッセージを送信した時点で、このスレッドには自動解放プールが存在しないため、「自動解放プールがありません」というコンソール メッセージが表示されます。

一般的な状況では、自動解放プールを明示的に作成します。ただし、これはレンダリング スレッドです。リアルタイム オーディオ スレッドの場合は、ロック (ヒープ割り当てを含む) を行ったり、objc メッセージングを使用したりしないでください (ロックする可能性があり、objc メッセージングは​​メッセージ送信にかかる最大時間を保証しないため)。ObjC API は、(事実上) リアルタイム オーディオ レンダー コンテキストには存在しません。

于 2012-08-01T22:18:37.737 に答える