アプリケーションで発生したクラッシュを再現するために、実用的ではないかもしれないわずかに誇張された繰り返し率のサンプルを作成する必要がありましたが、アプリで何が起こっているかを正確に示しています。を使用してバックグラウンドスレッドでNSStringを描画するNSOperations
と、クラッシュが発生する前にスタックトレースの最後の呼び出しでクラッシュが発生することがあります。WebCore::FontFallbackList::~FontFallBackList().
- (void)viewDidLoad
{
queue = [[NSOperationQueue alloc] init];
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self selector:@selector(timerDidFire:) userInfo:nil repeats:YES];
}
-(void)timerDidFire:(NSTimer*)timer
{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
CGRect rect = CGRectMake(0, 0, 50, 50);
UIGraphicsBeginImageContextWithOptions(CGSizeMake(rect.size.width, rect.size.height), YES, 0.0);
NSString *string = @"Sd";
[string drawInRect:rect withFont:[UIFont boldSystemFontOfSize:12] lineBreakMode:UILineBreakModeTailTruncation];
UIGraphicsEndImageContext();
}];
[queue addOperation:op];
}
上記のコードを使用すると、このクラッシュを簡単に再現できます。このクラッシュの性質と、なぜそれが起こっているのかについて、誰かが洞察を持っていますか?(この問題の解決策は設定です[queue setMaxConcurrentOperations:1];
)