gpt4 book ai didi

iphone - UIKit 字符串绘制方法中的错误?

转载 作者:可可西里 更新时间:2023-11-01 05:37:56 35 4
gpt4 key购买 nike

为了重现我在我的应用程序中遇到的崩溃,我必须创建一个重复率略微夸大的示例,这可能不切实际,但可以准确地演示我的应用程序中发生的情况。使用 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];)

最佳答案

这似乎是 iOS 5.x 中的回归:它发生在 5.0 和 5.1 模拟器以及 5.1 设备上,但不会发生在 4.3 模拟器或 4.3.2 设备上。

特别是字符串绘制似乎被破坏了——如果你所做的只是字符串绘制(避免创建/销毁上下文的开销),崩溃几乎立即发生:

-(void)threadFunc:(UIFont *)font {
@autoreleasepool {
NSString *string = @" ";
CGRect r = {{0,0},{50,50}};
UIGraphicsBeginImageContextWithOptions(r.size, YES, 0);
for(;;) {
@autoreleasepool {
[string drawAtPoint:r.origin withFont:font];
}
}
UIGraphicsEndImageContext();
}
}

-(void)startThreads
{
UIFont * font = [UIFont systemFontOfSize:12];
for (int i = 2; i--;)
{
[NSThread detachNewThreadSelector:@selector(threadFunc:) toTarget:self withObject:font];
}
}

编辑:它仅在多核环境(即双核设备或模拟器,假设是多核 Mac)中“几乎是即时的”。否则,大约需要 10-20 分钟才会崩溃。我没有双核 iOS 4.x 设备(唯一的可能性似乎是 iPad 2),但单核设备在一个多小时后没有崩溃。

我已经向 Apple 提出了一个错误,如果它影响到你,我鼓励你也这样做。

关于iphone - UIKit 字符串绘制方法中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589768/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com