【发布时间】:2016-09-26 05:19:42
【问题描述】:
在我的 iOS 应用程序中,当应用程序终止时,我在 C/C++ 代码中使用的全局变量之一发生 EXC_BAD_ACCESS 崩溃。请注意,应用程序不会被置于后台,而是通过在 info plist 文件中指定不在后台运行而在关闭应用程序时终止。
下面是相关代码..
#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 似乎在这种情况下,将释放全局变量,即 threadLocal_timer,这会导致我的代码中的 EXC_BAD_ACCESS 崩溃:
threadLocal_timer.Get()->repeat = repeat;
因此,全局变量由 iOS 释放,然后线程在应用程序终止时停止。我的问题是,除了在上面的代码中根本不使用静态或全局变量之外,还有什么解决方案可以解决这个崩溃?
【问题讨论】:
-
什么库,什么变量?抱歉,我们不是千里眼。
-
@SergeyA 这个 C/C++ 库是一个内部库,它本身在代码中有一些静态和全局变量。例如:ev_timer 就是一个这样的全局变量,在它上面会发生 EXC_BAD_ACCESS 崩溃
-
不,不清楚。我们不知道你的图书馆里发生了什么。
-
@SergeyA 似乎我只是因为提到单独的 c/c++ 代码作为库而更加困惑。它只是应用程序中的纯代码,但我们只是将其单独维护。再次修改我的问题以消除混乱。
-
@SergeyA 刚刚发布了一些代码并重新格式化了问题。感谢您的建议。
标签: c++ ios global-variables