相关疑难解决方法(0)

检测主线程之外的UI操作

注意:这个问题与从后台线程调用UIKit的警告有关,但没有给出下面两种方法的答案.

我有一个问题,应用程序屏幕快速闪烁.我过去已经遇到过这个问题,这是因为更新了主线程之外的UI元素.

因此,我将以下代码放在很多地方:

assertMainThread();
Run Code Online (Sandbox Code Playgroud)

这是:

#define assertMainThread() NSAssert([NSThread isMainThread],@"Method called using a thread other than main!")
Run Code Online (Sandbox Code Playgroud)

当然我无法使用assertMainThread()来覆盖整个代码,因为有很多地方和一些代码由背景GCD队列以合法的方式使用.

我看了很多地方,但找不到XCode或LLDB告诉我何时在主线程之外更新UI元素的方法.我认为可以使用符号断点或其他一些机制来破解UIKit中常见方法在主线程外部调用的地方,但是找不到方法.

我还以为UIKit可以在运行时发出警告吗?或者至少给我们一些工具来帮助调试这些问题.

我看过的另一种方法(但没有尝试)是使用一些代码覆盖技术,并尝试在视觉中提取代码中的哪个线程,但没有走那条路.

你对如何解决这个问题有任何想法吗?

uikit ios xcode4 lldb

20
推荐指数
1
解决办法
5867
查看次数

如何从辅助线程中找到对UIKit实例的调用?

我的应用程序在iOS 5中崩溃,因为我有一些代码从辅助线程调用UIKit实例.当您看到以下错误时,您知道有这个问题:

bool _WebTryThreadLock(bool),0x811bf20:不允许在网络线程上进行多次锁定!请提交一个错误.现在崩溃......

所以我的问题是,我可以通过哪些方法找到从辅助线程调用UIKit实例的代码?

以下是我已经尝试过的一些事情:

  1. 注释掉可能违反规则的块
  2. assert([NSThread isMainThread])在可能在辅助线程中处理的位置添加
  3. 添加了符号断点 _WebTryThreadLock

这些东西帮助我找到了问题所在.但是,在我的最终崩溃中,_WebTryThreadLock断点在任何其他线程中都没有堆栈跟踪.那么,如何在没有堆栈跟踪的情况下找到导致问题的代码?

谢谢你的时间!

cocoa-touch objective-c ios xcode4 ios5

7
推荐指数
1
解决办法
1953
查看次数

标签 统计

ios ×2

xcode4 ×2

cocoa-touch ×1

ios5 ×1

lldb ×1

objective-c ×1

uikit ×1