【发布时间】:2012-07-21 05:33:27
【问题描述】:
为了复制我在应用程序中遇到的崩溃,我必须创建一个重复率略高的示例,这可能不切实际,但可以准确地展示我的应用程序中发生的情况。在使用NSOperations 在后台线程上绘制 NSString 时,有时会发生崩溃,崩溃前堆栈跟踪上的最后一次调用是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];)
【问题讨论】:
-
如果你在块外(即在主线程上)实例化字体怎么办?
-
刚试了一下,还是没区别。
-
作为替代方案,如果我用 Core Text 绘制这个字符串,我就不会再崩溃了。最终可能会这样做。
-
向 Apple 提交错误,看看他们对此有何看法?
-
@maq .. 你有没有找到任何解决方法,因为我遇到了同样的问题
标签: iphone objective-c ios