2012-04-04 8 views
16

私はそのアプリのためにアプリケーションのデバッグをしていますので、 "すべての例外"のユニバーサルブレークポイントを有効にしました。ブレークポイント1保留"objc_autoreleaseNoPool"を指摘するブレークポイント

キャッチポイント2(スロー) - "objc_exception_throw" は

にObjC [11765]解決:以来、毎回私はアプリケーション、コンソールプリントを実行するクラス__NSCFLocaleのオブジェクト0x8f18ff0無しで自動解放しないと代わりにプール - ちょうど漏れた -

にObjC [11765]デバッグする)(objc_autoreleaseNoPoolでブレーク:

をデバッグするobjc_autoreleaseNoPool(上ブレイク) - - だけで漏れたクラス__NSCFNumberのオブジェクト0x8f190a0が所定の位置にいないプールで自動解放を

にObjC [11765]:クラス__NSCFLocaleのオブジェクト0x8f1fef0が所定の位置にいないプールで自動解放 - ちょうど漏れて - (objc_autoreleaseNoPoolでブレーク)

をデバッグするには、文字通り3回印刷します。私はこれが何を意味するのか分かりませんが、それは悪く見えます。アドバイスをいただければ幸いです。

+0

自動解放プールはありますか?あなたがxcode(プロファイルそれ)で見つけることができるヘルパープログラムの1つを使って、アプリケーションのリークをチェックしてください – chikuba

+0

私は自動解放プールを使用しません。確かに、私はあなたが1つを使用する理由を理解していないので、私は決して持っていません。しかし、私はそれを試してみます – Andrew

+0

それはApp delの前に現れます。しかし、私は全体の行をコメントアウトし、私はまだオブジェクトを漏れている。どんな考え? – Andrew

答えて

35

新情報

私の問題は、スウィズルにautoreleaseメソッドを作成することにより、どこにあるか私が決定しました。

あなたが何をしているかわからない限り、私はそれをすることをお勧めしませんが、これは私が知ったことです。

NSThreadは独自のスレッドを作成し、呼び出されたメソッドは自動解放プールにラップする必要があります。

グランドセントラルディスパッチは、ディスパッチ_...コマンドを使用するときに自動解放プールに適応します。しかし、あなたが手動で発送するとき。それを自動解放プールに入れたいかもしれません。

また、ARCはプール外で自動解放が行われることを通知することもできません。

したがって、ARCを使用していて、自動解放プールの外にいることがわかっている場合。あなたはそれについて何もできません。あなたはすべての便利な方法を避けたいでしょう。

これを使用してください。代わりに、この

[NSString stringWithFormat:@"%@",myObject]; 

[[NSString alloc] initWithFormat:@"%@",myObject]; 

これは、アークシステムを保持し、解放することができますが、あなたは便利なメソッドを使用していないので、便利な方法で行う基礎となる自動解放はスキップされます。

希望に役立ちます。

オリジナル回答

[OK]を、私はこの質問は十分に詳細に答えた感じいけません。

提示されているメッセージは、デバッガは、状況のデバッグに役立つ可能性のブレークポイントを

objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

指摘されました。今、このブレークポイントは実際に状況をデバッグするのに役立ちませんでした。デバッガにブレークポイントを追加する方法を知っておくことが重要であると思うので、そのエラーを解消するまで(インターネットを精査して何も見つけていない)時間を費やしました。

すべてのエラーをブレークしてもこれをキャッチしないのは面倒ですが、ここではブレークポイントをデバッガに追加する手順を示します。

は、あなたがしたいまず最初に、このタブをクリックすることにより、デバッガのブレークポイントナビゲーター

navigator toolbar

を選択している

breakpoint button

あなたはナビゲータペインの下部に向かって見て、プラスボタンを押す

Add Exception Breakpoint

これにより、手動でブレークポイントを追加することができます。

C++ブレークポイントを選択し、名前テキストフィールドにメッセージ名を入力しました。それは実際の休憩で行ったこの例外を追加した後

Adding custom C++ exception

しかし、これは目的とする開発者として有用かもしれません。これがAssemblyコードに壊れました。

assembly code at achieved breakpoint.

残念ながら、それが唯一のスレッドの呼び出しスタック上でこの点を示しました。

Thread list

そして、それはautoreleaseの問題がdispatch_onceコールで自動解放と呼ばれるクラスためだったことが判明しました。さらに調査したところ、+(ボイド)負荷;クラスのメソッドが何よりも先に呼び出されました。これはcall_load_methods関数を介して行われ、メインメソッドのスレッド外です。

Error Call and Stack

はこれを修正するために、私は単にコールの周りに自動解放プールラッパーを追加しました。

updated error call

別の解決策は、+(ボイド)負荷内側自動解放プールを追加することであってもよいです。方法。これは私の用途には十分でした。

注:問題を見つけて、結果の回答へのすべての経路を把握することができないため、ここに投稿にこれを追加します。デバッガが、リストされた関数にブレークポイントを追加するよう指示した場合、その情報を取得するための情報が必要です。うまくいけば、これは、この回答を見つけようとしている人々の不満を下げるでしょう。

+1

すばらしい答え。この投稿をまとめていただきありがとうございます。 – Andrew

+1

同上。そのブレークポイントのことは大きな問題でしたが、私の問題は全く別のものになってしまいました。時間をとっていただきありがとうございます。 –

+1

FYI、例外名が変更されたか、または私のものがobjC++ファイルではなくobjcに含まれているかどうかはわかりませんが、objc_autoreleaseNoPoolではなく__NSAutoreleaseNoPoolでブレークするようにブレークポイントを設定する必要がありました。いつか誰かを助けることを願っています。しかし、オリジナルの投稿は非常に役に立ちました。 – stuckj

1

ココアAPIのメソッドの多くは、オートレリースされたオブジェクトを返します。特に、[NSNumber numberWithLong:]など、initで始まらないオブジェクトを返すメソッド。自動解放プールがないと、それらのオブジェクトがリークします。 documentationNSAutoreleasePoolを使用する方法の詳細については、こちらをご覧ください。

+0

それはどういう意味ですか?この問題を解決するにはどうすればよいですか – Andrew

+0

ありがとうございます。私はそれを見て – Andrew

+0

ちょうどあなたがアプリを起動し、あなたが考えていないと、自動解放されたオブジェクトである美しさを使用する必要はありませんメインの1つを入れてください:) – chikuba

1

つまり、発生したスレッドに自動解放プールを作成する必要があります。そうしないと、割り当てられたオブジェクトは破棄されません(メッセージの示唆どおり)。だから、シンボルをブレーク/ポーズし、スレッド(またはプログラム)のエントリまでスタックし、オートリリースプールを追加してください。それで全部です。

+0

これはApp delの前に表示されます。しかし、私は全体の行をコメントアウトし、私はまだオブジェクトを漏れている。どんな考え? – Andrew

+0

自動解放プールを追加する必要があります。ブレークポイントがヒットした実行ポイントより早く実行されます。あなたのメインスレッドであれば、自動解放プールを 'int main()'に追加してください(注意:あなたのプロジェクトテンプレートはあなたのためにこれを実行したでしょう)。それ以外の場合は通常、スレッドのエントリに追加します。 – justin

関連する問題