2012-04-30 5 views
1

この問題に関して多くの記事を残して申し訳ありませんが、私はここで進歩しています。はコールバック中に何かできますか?基本的な目的の問題

私はコールバック関数を持っています。これはC言語であり、新しいバッファが到着したときに呼び出されました。

ここでは、コールバックで何もしないこと、mallocなどではないと言われました。

今度は、新しいバッファを別のクラスに送信したい(サークルバッファを作成してバッファをたくさん保存する)。

しかし、コールバックから別の関数を呼び出すと、その関数内でやっているのと同じことです。その関数でDSPを実行すると時間がかかるので、そのコールバックでそれを行うのと同じです。

froof: 別のクラスの別の関数とそのokにデータを送信していますが、私がNSLOGにしようとすると、もう一度このメモリリークが発生します。ここ

iはコールバックからを呼び出す他のクラスである:

- (id)init 
    { 
     self = [super init]; 
     if (self) 

     { 
      data = malloc (sizeof(SInt16) * 4000); 


     } 
     return self; 
    } 

-(void)sendNewBuffer:(SInt16*)buffer 
    { 

     data=buffer; 

     NSLog(@"data arrived size is : %lu",sizeof(data)); 
     for(int i=0; i<sizeof(data);i++) 
     { 
      NSLog(@"%d",data[i]); 
     } 

    } 

ONLY comment the log、それはメモリリークなしで動作します。 これはコールバックがそれを待っていることを意味します!

どうすれば他の人と並行してそのデータを処理できますか? 私は今それを1週間費やしています。

ありがとうございました。

+1

明確にする必要があります。誰があなたに何もしないように言ったのですか?そして、もし彼らが本当に「何か」と言ったら、あなたは何もできなかったらコールバックが存在しないので、彼らは不愉快に不正確になっていました。あなたが知る必要があることは、自分が何であるかの詳細と、コールバックコンテキストから行うことが許可されていないことです。 –

+0

コールバックは何を呼びますか? – Dani

+0

また、サイドノートでは、バッファ・データをどのようにループするべきではありません。 'sizeof'はパラメータデータ型のサイズを返します。あなたは、署名された16ビット整数へのポインタのサイズを求めています。ポインタが指しているバッファのサイズを尋ねるのではありません。別の引数としてバッファの長さを渡す必要があります。 –

答えて

1

NSLogのNSStringなどのObjective-Cオブジェクトを使用するとメモリリークが発生する可能性があります。これらのオブジェクトは自動リリースされる可能性があります。

あなたのコールバックは別のスレッドから呼び出されることがあります。これは、コールバックにブレークポイントを置き、メインスレッドまたはセカンダリスレッドの場合はデバッガを調べることで確認できます。

すべてのセカンダリスレッドには、独自のAutoReleaseプールが必要です。メインスレッド用に自動的に作成されますが、セカンダリスレッドを作成する場合は、明示的に作成する必要があります。

また、コールバックにスタッフを割り当てない理由の1つは、通常はパフォーマンスです。呼び出されたスレッドをブロックしないように、コールバックを最小限に保つ必要があることがよくあります。

+1

ありがとうございますが、これはそれとは関係ありません。私がしたとしても:NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];同じことが起こっている。 – user1280535

0

もし私が推測しなければならないのなら、コールバックは割り込みコンテキストで呼び出されている可能性があります。したがって、mallocなどはおそらく致命的です。 データをバッファにコピー(例:memcpy)し、後で実行するためのコード/シグナル処理コードをスケジュールする(例えば、条件変数、ランループソースなどを使用する)

+0

これは良い解決策ですが、私はこのスケジュールを避けたかったのです。私はnsnotificationセンターを使いたいと思った。 – user1280535

1

Cチュートリアル。

  • data=buffer;:これはdataの前の値をリークし、我々は本当にであなたを助けることができないあなたのコードを有する少なくとも2つの問題があります。データにコピーするか(memcpy)、メモリを最初に解放して(free)、ポインタを保持する必要があります...コールバックの後にバッファがスコープ外に出る場合を除き、唯一のオプションはコピーすることです。
  • sizeof(data):これは機能しません。 dataはポインタです。それが第二はあなたがが正しく、少なくともではない詳細な情報なしに、コールバックを実装することができないことを意味し

で指摘されているデータの量を知りません。 (バッファにデータ量の何らかの指標があるか、または一定のサイズであるか)

+0

それを残して、忘れてください。たとえ私がそこに簡単な単語をNSLogで書いていても、私はこの漏れを取得します。これは本当にここで問題となっているものです。 – user1280535

関連する問題