iOS应用程序在全局/静态变量上使用EXC_BAD_ACCESS在应用程序终止时崩溃

时间:2016-05-27 19:10:22

标签: c++ ios global-variables

在我的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发布。我的问题是,除了在上面的代码中根本不使用静态变量或全局变量之外,有什么解决方法可以解决这个崩溃吗?

1 个答案:

答案 0 :(得分:0)

你的问题太模糊了。

我编写的应用程序具有长期运行的后台进程,这些进程依赖于全局资源,就像您描述的那样。

我所做的是拥有全局后台任务。每次我启动其中一个长时间运行的任务时,我在主线程上调用了一个增加任务计数的函数。

在长时间运行的任务的关闭代码的最后,我调用另一个递减计数器的函数(在主线程上)。)

在减少线程数的代码中,如果计数达到零,我会释放并取消全局资源。

使用该逻辑,在完成最后一个后台线程之前,不会释放全局资源。

这样的方法可能会对你的问题有所帮助,但我不能在不了解更多信息的情况下更加具体。