1

何が原因なのか気になります。コードには、performSelectorInBackgroundを使用して呼び出すメソッドがいくつかあります。これらの各メソッド内に、メソッドの最初に割り当て/初期化され、メソッドの最後にリリースされる自動リリースプールがあります。

これはiOS3.1.3/ 3.2 / 4.2 / 4.2.1で完全に機能しますが、iOS 4.0では、[myPoolrelease]を呼び出した後に発生するEXC_BAD_ACCESS例外で致命的にクラッシュします。

この奇妙な振る舞いに気付いた後、私はコードの一部を書き直し、クライアントOSが4.0の場合にアプリを「並列性を低くする」ことを考えていました。

それを行った後、アプリがクラッシュした次のポイントは、ReachabilityCallback-ApplesReachability"Framework"のメソッド内でした。

さて、今私は何をすべきかよくわかりません。

スレッド化されたメソッド内で行うことは、非常に単純なxml解析です(ココアの呼び出しやUIに影響を与えるようなものはありません)。各メソッドが終了すると、調整スレッドがリッスンする通知を送信し、すべての並列化されたメソッドが終了すると、調整スレッドはviewcontrollersなどを呼び出します。

何がこの奇妙な振る舞いを引き起こすのか、私にはまったくわかりません。特にApplesCodeも失敗するからです。

どんな助けでも大歓迎です!

ありがとう、サム

4

4 に答える 4

3

ゾンビを検出する最良の方法は次のとおりです。

  1. [グループとファイル] セクションで [実行可能ファイル]セクションを展開し、アプリ名を右クリックして [情報を見る] を選択します
  2. 上部の [引数] タブを選択し、 [環境に設定する変数] セクションに新しいエントリを追加します。新しい変数にNSZombieEnabledという名前を付け、その値をYESに設定します。

この後、どの解放されたオブジェクトを呼び出すかについての情報がコンソールに表示されます。

于 2011-01-09T15:14:48.800 に答える
2

問題を解決したようです。問題は、(多くの人が示唆しているように)メソッド内でNSURLオブジェクトをオーバーリリースしたことです。[NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:&error];

stringWithContentsOfURLパラメータとして渡したNSURLオブジェクトを自動解放すると思います。

問題のリリースを削除した後、urlRequest消えました。それでも、iOSのバージョンが異なれば、その点で動作が異なるのは非常に奇妙だと思います。

メソッド全体は次のようになりました。

-(NSString*)downloadContent:(NSURL*)urlRequest

{
NSString * data = nil;

NSError * error = nil;

data = [NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:&error];    

//[urlRequest release]; //Crashes on iOS 4.0 / 4.1 later when autoreleasepool is being released.

return data;    

}

于 2011-01-07T10:04:45.613 に答える
1

performSelectorInBackgroundもでいくつかの奇妙な振る舞いに気づきました。私はこれについて完全に間違っているかもしれませんが、私の場合は以下を使用しました:

[NSThread detachNewThreadSelector:@selector(blah) toTarget:self withObject:nil];

より良い結果が得られます。そのメソッドを使用しているときに、メインスレッドにアクセスする必要がある場合(たとえば、UIを更新するため)、次のことができます。

[self performSelectorOnMainThread:@selector(blah2) withObject:nil waitUntilDone:false];
于 2011-01-06T17:17:09.817 に答える
1

その自動解放プールのスコープで作成された自動解放されたオブジェクトが、解放されるべきではない場所で解放されているように聞こえます。SDK のバージョンによって動作が異なる理由は不明です。問題の原因となっている実装の違いがどこかにあるはずです。「ビルドと分析」を使用してコードをビルドしましたか? 何かが過剰にリリースされている可能性があることを示唆していますか?

于 2010-12-17T11:01:20.180 に答える