グランドセントラルディスパッチ - スレッド間でデータを渡す
-
29-09-2019 - |
質問
文字列を生成するためにバックグラウンドでプロセスを実行しようとしています。これはメインスレッドで使用されます(リモートサーバーに送信されます)。コードはシミュレータで正常に動作し、文字列は予想どおりに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);
});
});
これがなぜクラッシュするのか、そしてそれを修正するための最良の方法を知っている人はいますか?
質問を明確にするためにコードを簡素化するという間違いを犯しました。
メインキューでは、実際に別の呼び出しで自分自身にメッセージを送信すると、これにより悪いアクセスが発生します。
解決策は、私のasyncキューのメソッドを呼び出し、メソッド内でコードをdispatch_async(dispatch_get_main_queue()、 ^{})にラップすることでした。ブロック。
うまくいけば、これが他の誰かを助けるでしょう。
解決
質問を明確にするためにコードを簡素化するという間違いを犯しました。
メインキューでは、実際に別の呼び出しで自分自身にメッセージを送信すると、これにより悪いアクセスが発生します。
解決策は、私のasyncキューのメソッドを呼び出し、メソッド内でコードをdispatch_async(dispatch_get_main_queue()、 ^{})にラップすることでした。ブロック。
うまくいけば、これが他の誰かを助けるでしょう。
他のヒント
私の推測では、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];
});
});