、私はアプリが終了したとき、私は私のC/C++コードで使用グローバル変数の1にEXC_BAD_ACCESSクラッシュを取得しています。アプリはバックグラウンドにはされませんが、情報plistファイルでバックグラウンドで実行しないように指定することでアプリを終了する際に終了します。iOSアプリがクラッシュし、私のiOSアプリケーションで
次の関連コードが..です
#include "chromium/threading/thread_local.h"
#include "libev/ev.c"
namespace simplegetter {
ThreadLocalPointer<ev_io> threadLocal_sock_watcher;
ThreadLocalPointer<ev_timer> threadLocal_timer;
void start_get (my_get_struct* get_struct) {
ev_io* sock = new ev_io;
ev_timer* temp_timer = new ev_timer;
threadLocal_sock_watcher.Set(sock);
threadLocal_timer.Set(temp_timer);
//... other code..
}
void fire_again(my_get_struct* get_struct, uint32_t rtt) {
double repeat = get_client_repeat_value(rtt);
if (repeat < 0.5) repeat = 0.5;
threadLocal_timer.Get()->repeat = repeat;
get_struct->prev_timeout_finish_time = CURRENT_TIME_MS;
ev_timer_again(threadLocalLoop.Get(), threadLocal_timer.Get());
//.. other code
}
//... other code
};
threadLocal_timerは私が話しているグローバル変数です。 start_getメソッドが新しいスレッドで呼び出され、ネットワークリソースが取得されます。 fire_againメソッドは、操作が完了するまでstart_getメソッドを呼び出すスレッドで複数回呼び出されます。
アプリが終了したとき(つまり、iOSがメインスレッド上でexit()コールを送信したとき(つまり、アプリが一時停止状態に留まらない、またはバックグラウンドで実行されないため)、iOSはラインで私のコードでクラッシュEXC_BAD_ACCESSにつながるこの場合にはグローバル変数すなわちthreadLocal_timerをオフにリリースされる:スレッドが停止する前に
threadLocal_timer.Get()->repeat = repeat;
ので、グローバル変数は、iOSによって解放ですアプリの終了時に。私の質問は、私は静的またはグローバルを使用してから離れてこのクラッシュに対処する方法については何か解決策はありますか?上記のコードですべてariables?
どのようなライブラリ、どのような変数ですか?申し訳ありませんが、私たちは千歳です。 – SergeyA
@SergeyAこのC/C++ライブラリは、コード内に静的変数とグローバル変数を持つ内部ライブラリです。 ex:ev_timerは、EXC_BAD_ACCESSクラッシュがあるグローバル変数の1つです – Ravi
いいえ、明確ではありません。私たちはあなたのライブラリ内で何が起こっているのか分かりません。 – SergeyA