2017-08-25 8 views
-1
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); 
    for (int i = 0; i < 10000; i++) { 
     dispatch_async(queue, ^{ 
      self.str = [NSString stringWithFormat:@"asgdhjagsjhd"]; 
     }); 
} 

}なぜこの同時Objective-Cのコードのクラッシュ

私はこのコードを実行するたびに、それは誰もがなぜ私に言うことができる、クラッシュしますか?

+0

あなたのキューは 'viewDidLoad'の外に置かなければなりません。 – clemens

答えて

1

あなたは非アトミックプロパティ、 でself.strを使用した場合、それはすべてのスレッドによってアクセスされ、変更される、 私は原因をクラッシュされ、この上記のコードを、チェックするには、他のスレッドながら、一つのスレッドでオブジェクトを解放していますそれにアクセスしようとしています のためリリースそのオブジェクトがクラッシュします。 スレッドセーフを使用したい場合アトミックアブソリュートself.strとしてください。

+0

ありがとうございます! – user3016644

+0

この回答は完全に間違っています。アトミックプロパティはスレッドの安全性とは関係ありません。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW1 –

関連する問題