2012-07-17 77 views
4

我收到零星的EXC_BAD_ACCESS崩溃,我想这与多线程问题有关。 (我试图用僵尸进行分析,但在分析时应用程序不会崩溃)。所以我想知道是否有任何种类的机制,用于调试目的,以确定一个对象是否被多个线程同时访问?如果是这种情况,可能以某种方式打印日志语句?确定一个对象是否被多个线程访问?

+3

更可能发生的情况是,你只是访问已物体被释放。这通常是'EXC_BAD_ACCESS'的结果。这也与未启用僵尸崩溃一致。你正试图访问一个'nil'对象。 – 2012-07-17 17:58:46

+1

另外,这是一个更好的方法来防止***它,不检测它。 – CodaFi 2012-07-17 18:03:43

+0

首先我想看看我的假设是否正确,因为我不确定问题是什么。但看到编辑,我认为这可能与绘图有关。 – Snowman 2012-07-17 18:07:38

回答

5

,如果你是在一个线程中执行的唯一一个将依靠无人防守的静态变量告诉一个简单的和肮脏的方法:

-(void)concurrentMethod { 
    static NSThread *runningThread = nil; 
    NSThread *myThread = [NSThread currentThread]; 
    if (runningThread != nil) { 
     NSLog(@"Thread %@: running concurrently with %@", runningThread, myThread); 
    } 
    runningThread = myThread; 

    ... // Do the useful stuff here 

    if (runningThread != myThread) { 
     NSLog(@"Thread %@: pre-empted by %@", myThread, runningThread); 
    } 
    runningThread = nil; 
} 
+0

那么请等待这个工作到底如何?我遇到了麻烦。 – Snowman 2012-07-17 18:46:52

+0

因此,如果runningThread!= myThread,这是否意味着两个不同的线程试图同时访问同一个对象? – Snowman 2012-07-17 18:51:36

+0

@mohabitar当一个线程进入你的方法时,它会检查'runningThread'变量(它是'static',因此在所有线程之间共享)为'nil'。如果是,则该线程将其设置为其自己的ID;如果不是,则其他一些线程必须将其设置为不同的ID。线程无论如何都会覆盖ID,然后继续执行有用的操作。之后,它会检查其ID是否被覆盖,最后将静态恢复为“nil”。 – dasblinkenlight 2012-07-17 18:51:42

相关问题