そのため、多くの計算を行うアプリがありますが、グローバル ディスパッチ キューを使用してマルチスレッド化した場合にのみクラッシュします。私はそれらを間違っているかもしれないと思います。これがクラッシュを引き起こしている理由を誰か説明できますか? または、少なくともどのようにデバッグしようとするか。
このようにすると、答えがうまく出力されます。私は楽器を使ってコードを調べましたが、漏れなどはありません。
NSStringEncoding encoding;
NSError *error;
//Read in data file
NSString *Data1FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data1" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *strides = [[Data1FileContent componentsSeparatedByString:@"\n"] mutableCopy];
//Read in data file
NSString *Data2FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data2" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *gaitTimes = [[Data2FileContent componentsSeparatedByString:@"\n"] mutableCopy];
//Math
NSMutableArray *result = [gaitlyapunov gaitlyapunov:strides withTimeSteps:gaitTimes withFreq:150 withSegmentApproach:@"strides"];
NSLog(@"result = %@", result);
[gaitTimes release];
[strides release];
});
ただし、コード内で UILabel を更新しようとすると、クラッシュが発生します。
エラー:
(lldb) //Thrown randomly in the math
問題を引き起こすコード:
//Create a queue
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//This prints out fine
dispatch_async(dispatch_get_main_queue(), ^{
statusText.text = [NSString stringWithFormat:@"processing..."];
});
NSStringEncoding encoding;
NSError *error;
//Read data
NSString *Data1FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data1" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *strides = [[Data1FileContent componentsSeparatedByString:@"\n"] mutableCopy];
//Read data
NSString *Data2FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data2" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *gaitTimes = [[Data2FileContent componentsSeparatedByString:@"\n"] mutableCopy];
//Math, that causes crash in this code only
NSMutableArray *result = [gaitlyapunov gaitlyapunov:strides withTimeSteps:gaitTimes withFreq:150 withSegmentApproach:@"strides"];
//This should print the result into the label
dispatch_async(dispatch_get_main_queue(), ^{
statusText.text = [NSString stringWithFormat: @"result: %@", result];
});
[gaitTimes release];
[strides release];
});