访问文本字段时从其他线程获取锁的警告

Posted

技术标签:

【中文标题】访问文本字段时从其他线程获取锁的警告【英文标题】:Warning about obtaining lock from other thread when accessing text field 【发布时间】:2013-01-08 02:48:55 【问题描述】:

我有一个名为 _passwordTextFieldUITextField,我在其中隐藏了输入:

[_passwordTextField  setSecureTextEntry:YES]; 

每次我使用passwordTextField.text 访问该字段的文本时,都会看到以下警告:

void _WebThreadLockFromAnyThread(bool), 0x9077460: 从主线程或web线程以外的线程获取web lock。不应从辅助线程调用 UIKit。

如何删除此警告?

【问题讨论】:

是的,所有代码都在主线程中调用,并且只有 SecureTextEntry UITextField 给出了这种警告,通常用于 UITextField 。 【参考方案1】:

这与UITextField 无关。 ios UIKit 要求对 UI 的任何直接操作都在主线程上完成,而不是在后台线程上完成。

如果您这样做,您的应用将不稳定,在某些情况下甚至可能崩溃。所以规则不要从后台线程更新 UIKit 元素。请检查您的代码。

如果您使用的是 iOS >= 4,则可以使用 GCD 代替:

dispatch_async(dispatch_get_main_queue(), ^
    [self doSomething:1 b:2 c:3 d:4 e:5]; //changes UI method
);

更新:请再次检查您的代码。在处理线程问题时,您需要观察的不是出现此警告的哪一行,而是需要完整查看。查看整个方法是从主线程还是后台线程调用..

【讨论】:

[body setObject:_nameTextField.text forKey:@"username"]; // ,它看起来只显示 SecureTextEntry UITextField 的waring。 请再次检查您的代码。在处理线程问题时,您需要观察的不是出现此警告的哪一行,而是需要完整查看。查看整个方法是从主线程还是后台线程调用

以上是关于访问文本字段时从其他线程获取锁的警告的主要内容,如果未能解决你的问题,请参考以下文章

计算机基础之锁的分类

什么是自旋锁

Java-锁与实现

Java中使用到的锁

多线程编程-- part5 锁的种类以及辨析

Java并发工具类原子类