2012-05-08 5 views
0

スレッド内でsetTextを実行しようとすると「EXC_BAD_ACCESSでクラッシュする」とクラッシュします。なぜ[UITextView "setText"]をNSThreadで使用できないのですか?

???

THX UIへ

#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]; 
} 
+1

'Thread_Tcp'は、Objective-Cのメソッドの名前のお粗末な選択です。規約に従うのが最善です。この場合、メソッド名は 'lowerCamelCase'の形をとります(NSStringの' UTF8String'のようなよく知られている頭字語で始まるメソッドは例外です)。 – dreamlax

答えて

4

変更は唯一のUIスレッドから実行する必要があります。このコンセプトは、ほとんどのUIプログラミング環境/フレームワークで似ています。

あなたは呼び出すことによって、それを修正することができます:

-(void) Thread_Tcp 
{ 
    [tvCommand performSelectorOnMainThread:@selector(setText:) withObject:@"HELLO" waitUntilDone:YES]; 
} 
+0

このコード行をThread_Tcpに入れますか?私は何とかThread_Tcp内からtvCommandを更新する必要があります。 thx – jdl

+0

@jdl - 編集を参照してください。 – MByD

3

のUIKitはスレッドセーフではありません!バックグラウンドスレッドからUI要素を更新すると、ライブラリの内部状態が壊れてクラッシュする可能性があります。 UI要素と対話する必要がある場合は、メインスレッドで行います。

使用このメインスレッドでのTextViewを更新するには:

[tvCommand performSelectorOnMainThread:@selector(setText:) withObject:@"HELLO" waitUntilDone:NO]; 
関連する問題