johnnieb johnnieb - 9 months ago 37
iOS Question

How can I find calls to UIKit instances from a secondary thread?

My app is crashing in iOS 5 because I have some code that is calling UIKit instances from a secondary thread. You know you have this problem when you see the following error:

bool _WebTryThreadLock(bool), 0x811bf20: Multiple locks on web thread not allowed! Please file a bug. Crashing now…

So my question is what are some ways that I can find the code that is calling the UIKit instances from a secondary thread?

Here are some things I’ve tried already:


  1. Commented out blocks that could be violating the rule

  2. Added
    assert([NSThread isMainThread])
    in places that might be processing in secondary thread

  3. Added a symbolic breakpoint for
    _WebTryThreadLock



These things have helped me to find problem areas. However, in my final crash the
_WebTryThreadLock
breakpoint has no stack trace in any of the other threads. So, how I can find the code that causing the problem without a stack trace?

Thanks for your time!

Answer Source

Your assert() is probably the most valuable tool in this. I've been known to put a similar assertion at the beginning of every method in my Controller classes. If that doesn't find it, I add the assertion to my View classes. If that doesn't find it, I add it to any Model classes that I think are main-thread only.

To @craig's comment, the fact that it claims to be an internal bug might be accurate. But I think you're on the right path to closely examine your own code first.