2012-02-28 4 views
0

バッファをサンプリングするオーディオクラスがあり、NSNotificationで別のクラスを呼び出し、データ(int)を送信します。警告なしで自動公開されましたか?

私は多くの何倍秒を実行し、このwarnningを得る:

class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() 

class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

それは意味ないでしょうか? はい、私はそのクラスにNSNumberNSStringを持っています。 割り当てられません。

別スレッドが必要ですか? 何が間違っていますか?

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

+1

'objc_autoreleaseNoPool()'にブレークポイントを設定するとどうなりますか?スタックには何が表示されますか? – user1118321

+0

どのようにobjc_autoreleaseNoPool()にブレークポイントを置くのですか –

答えて

1

つまり、コードが実行されているどのスレッドでも、コード実行前にはautorelease poolが設定されていません。 AppKitまたはUIKitベースのアプリケーションの場合、フレームワークは主にメインスレッドで管理しますが、他のスレッドを使用している場合は、自分で作成する必要があります。 AppKitやUIKitに基づいていないアプリケーションの場合、Objective-Cコードを実行しているときには常にオートリリースプールがあることを確認する必要があります。

+0

あなたはARCを使用していて、これはまだ起こっていますか?私はこの問題を抱えていますが、XcodeはNSAutoreleasePoolを追加できません。 – Justin

+0

@Justin: '@ autoreleasepool'指示文がうまく動作するはずです。それはありませんか? – Chuck

+0

はい、そうです。ありがとうございました。 – Justin

1

アプリケーションのmain()関数で自動解放プールを使用していますか?自動解放されたインスタンスを使用していますか(はい、私はあなたがそれらをalloc-initしなかったことを知っていますが、[NSNumber numberWith ...]はメインスレッド以外のスレッドでalloc-init-autoreleasedオブジェクトを返しますか?最初に自動解放プールを設定していない場合、または複数のスレッドを使用している場合は、スレッドごとに個別のNSAutoreleasePoolを作成する必要があります。

+1

オブジェクトがオートレリースすることができる理由はいくつもあります。例えば、多くのアクセサ実装はオートレリースされたオブジェクトです。最も安全なバージョンのゲッター(私は合成されたアクセサによって使用されていると思います)は、 'autoreleaseを返す 'ように動作します。自動解放プールを使用せずに任意のFoundationベースのコードを実行するのは一般的に安全ではありません。 – Chuck

+0

はい。しかし、私は最も安全なgetterが返すautoreleaseを返すとは言いません。オブジェクトが存在しない場合、そのプロパティが存在することを期待するべきではないので、安全性の「酷使」または「過剰使用」のようなものです。 –

+0

アップルが認可した慣行なので、私はほとんどそれを「虐待」と呼ぶことはありません。とにかく、それはかなり一般的なので、私はこのイディオムに遭遇したときに誤ったコードを書いてはいけません。 – Chuck

関連する問題