Search code examples
objective-cioscocoa-touchxcode4ios5

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!


Solution

  • 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.