質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

833閲覧

URLSessionで再帰的に通信を行うとクラッシュすることがある

kijikiji

総合スコア0

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/08/03 07:30

編集2020/08/03 11:09

URLSessionで再帰的に通信を行う処理を書いています。
URLSessionTaskを何回かresumeすると以下のようなエラーが発生し、クラッシュすることがあります。
・エラー発生箇所
Queue : com.apple.CFNetwork.LoaderQ (serial)
・エラー内容
EXC_BAD_ACCESS (code=1, address=0x0)

URLSessionを短時間に複数行うとクラッシュするのでしょうか。
また、再帰的に通信を行いたい場合上記エラーを回避することは可能でしょうか。

調べたところ、以下のような記事が見つかりました。
https://www.366service.com/jp/qa/9033c51b6c877350e25c2dc2a562099e
実機でもクラッシュが起きたので、違うと考えていますが、appleのバグという可能性もあるのでしょうか。

以下にPlaygroundで動作確認したコードを記述いたします。
試しに100回ループさせたところ途中でクラッシュしました。

swift

1import Foundation 2 3test(url: "",num: 0); 4 5func test(url:String, num:Int){ 6 7 requestSync(urlString: url) { 8 print(num) 9 if(num < 100){ 10 test(url: url, num: num + 1) 11 } 12 13 } 14} 15 16func requestSync(urlString:String,handler:@escaping()->Void){ 17 18 let semaphore = DispatchSemaphore(value: 0) 19 20 let session = URLSession(configuration: .default) 21 let url = URL(string: urlString)! 22 let request = URLRequest(url: url) 23 24 let task = session.dataTask(with: request) { (data, response, error) in 25 handler() 26 semaphore.signal() 27 } 28 29 task.resume() 30 semaphore.wait() 31}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thyda.eiqau

2020/08/03 07:55

現状のコードをご提示ください
kijikiji

2020/08/03 08:47

コードの記載をいたしました。 どうぞよろしくお願いします。
thyda.eiqau

2020/08/03 10:12

拝見しました。現実的に100個もセマフォを作って100回も通信をさせるようなシチュエーションが存在するのですか? あと、SessionDataTaskのコールバックの中に (semaphore.signal()の前に) handler()をおいているので、セマフォを置く意味がないと思うのですが、どういう意図でこのような実装になっているのでしょうか?
kijikiji

2020/08/03 10:23

実際のコードでは通信結果を受けて、別URLに再帰的に通信を行っております。 同期処理にするためにセマフォを置いているのですが、セマフォをおかなくても今回のクラッシュは発生したため、簡潔にお伝えするために消しておくべきでした。申し訳ございません。
thyda.eiqau

2020/08/03 10:50

ご提示のコードでは、セマフォがなくても通信完了時に次の通信に移るようになっていますが、そこは理解されていますか?(本題とはずれますが、念の為……) あと、このコードだと構文エラーになると思うのですが、状況を再現させることができるコードを提示いただけませんでしょうか。
kijikiji

2020/08/03 11:19

ご指摘ありがとうございます。確かに必要ありませんでした。 再現コードのimportを書き忘れていたので修正しました。 どうぞよろしくお願いします。
fuzzball

2020/08/04 05:26

thyda.eiqauさんの指摘にもありますが、signal()のタイミングをhandler()の前にするとどうなりますか? semaphore.signal() handler() あと、本当にセマフォ外してもクラッシュしますか?(クラッシュするとしても、別の原因ではないですか?)
thyda.eiqau

2020/08/10 17:52

ちなみにですが、オリジナルのコードと、こちらで適当にセマフォを外して実行したコードとで、127.0.0.1とgoogle.comをターゲットに試してみましたが、クラッシュしませんでした。ので、ハード(メモリとか)とか通信環境とかに依存している気がします。メモリであれば無意味なセマフォが怪しい気がします(怪しいというか、ご提示のコード内で見える範囲では他にはないというか)が、そこを踏まえて「現実的に100回も通信をさせるのか」というのを質問しています。現実に起きないシチュエーションのことを考えてもしょうがないので。
thyda.eiqau

2020/08/10 17:54

より正確には、「オリジナルの(ままだと構文エラーになるので、それを修正した)コード」でした。失礼しました。@escapingしているのでtest(url: url, num: num + 1)では呼び出せないはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問