为什么我不能在NSThread中执行[UITextView“setText”]?

时间:2012-05-08 01:11:41

标签: objective-c cocoa-touch

在线程中尝试setText时,崩溃时出现“与EXC_BAD_ACCESS崩溃”。

???

THX

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITextViewDelegate>
{
    UITextView *tvCommand;
}
@end

---------

-(void) Thread_Tcp
{
    [tvCommand setText:@"HELLO"];//crashes here with EXC_BAD_ACCESS
}


- (void)viewDidLoad
{
    NSThread *hThread = [NSThread alloc] initWithTarget:self selector:@selector(Thread_Tcp) object:nil];

    [hThread start];
}

2 个答案:

答案 0 :(得分:4)

UI的更改应仅从UI线程完成。这个概念在大多数UI编程环境/框架中都是类似的。

你可以通过调用:

来修复它
-(void) Thread_Tcp
{
    [tvCommand performSelectorOnMainThread:@selector(setText:) withObject:@"HELLO" waitUntilDone:YES];
}

答案 1 :(得分:3)

UIKit不是线程安全的!从后台线程更新UI元素可能会破坏库的内部状态并导致崩溃。如果您需要与任何UI元素进行交互,请在主线程中进行。

使用它来更新主线程中的textView:

[tvCommand performSelectorOnMainThread:@selector(setText:) withObject:@"HELLO" waitUntilDone:NO];