1

バックグラウンドでプロセスを実行して文字列を生成しようとしています。文字列はメイン スレッドで使用されます (リモート サーバーに送信されます)。コードはシミュレーターで正常に動作し、文字列は期待どおりに 2 回ログに記録されます。

デバイス (iPad、4.2、およびさまざまな iPhone) では、毎回 EXC_BAD_ACCESS でクラッシュします。myString は範囲外のようですが、これはウィキペディアの同じ原則が使用されている例に反しているようです。

コードは次のとおりです。

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
 });

});

これがクラッシュする理由と、それを修正する最善の方法を知っている人はいますか?


質問を明確にするためにコードを単純化するという間違いを犯しました。

メイン キューで、実際に別の呼び出しで自分自身にメッセージを送ると、これが不正なアクセスの原因になります。

解決策は、非同期キューでメソッドを呼び出し、メソッド内でコードを dispatch_async(dispatch_get_main_queue(), ^{}); でラップすることでした。ブロック。

うまくいけば、これは他の誰かを助けるでしょう。

4

2 に答える 2

3

質問を明確にするためにコードを単純化するという間違いを犯しました。

メイン キューで、実際に別の呼び出しで自分自身にメッセージを送ると、これが不正なアクセスの原因になります。

解決策は、非同期キューでメソッドを呼び出し、メソッド内でコードを dispatch_async(dispatch_get_main_queue(), ^{}); でラップすることでした。ブロック。

うまくいけば、これは他の誰かを助けるでしょう。

于 2010-11-07T20:54:22.157 に答える
0

私の推測では、NSString は autorelease オブジェクトであるため、メイン キュー コード ブロックで使用される前に範囲外になり、解放されます。NSString に保持/解放を追加してみてください:

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 [myString retain];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
  [myString release];
 });

});
于 2010-11-07T20:23:06.403 に答える