导致错误的对象的内存地址,找到哪个对象

时间:2012-04-23 20:48:06

标签: objective-c ios

我在我的应用中遇到_WebThreadLockFromAnyThread错误。它不会崩溃我的应用程序(像这样的每个其他错误已经崩溃了我的应用程序)。

我无法追踪违规代码行的位置。

我知道这个错误是当我尝试更新辅助线程上的UI时。我只使用1个线程,然后主要用于KVO'ing。我使用

进行所有方法调用
[self foo]

错误是:

void _WebThreadLockFromAnyThread(bool), 0xb29ca60: Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread.

错误在我的日志中出现在每次执行的同一位置,它在这两个日志条目之间打印:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"observeValueForKeyPath thread%@", [NSThread currentThread]);

    if ([keyPath isEqualToString:MAXY])
    {
        NSLog(@"current tabDictionary:%@", self.tabDictionary);

但是应该与我的if stmt更改UI无关,所以我假设它在我的程序中的某个地方发生。

我可以使用它的内存地址来确定它是哪个对象吗?或尝试从哪个线程?

2 个答案:

答案 0 :(得分:3)

我猜测tabDictionary包含UIViewController的实例,并且您对NSLog的调用导致访问视图控制器的属性以生成记录的字符串。这是您在辅助线程上的UIKit访问。

当调用observeValueForKeyPath:时,您无法保证您所处的线程。如果这很重要,您应该检查您是否在主线程上,如果不是,请使用performSelector:onMainThread:dispatch_async来确保您是。

答案 1 :(得分:0)

  

我知道这个错误是当我尝试更新辅助设备上的UI时   线程。

UI更新不是线程安全的。每当您需要更新UI时,您需要回调主线程进行更改。如果您的方法有0或1个参数,则有两个选项GCD[[NSThread mainThread] performSelector:onThread:withObject:waitUntilDone:];