0

我只收到以下关于设备的警告:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
0   QuartzCore                          0x3763c65d <redacted> + 220
1   QuartzCore                          0x3763c541 <redacted> + 224
2   QuartzCore                          0x3763fe2f <redacted> + 30
3   QuartzCore                          0x3763b9bf <redacted> + 318
4   QuartzCore                          0x3763b87b <redacted> + 50
5   QuartzCore                          0x3763b80b <redacted> + 538
6   MyApp                              0x000df597 -[CommonClass orangeGradient:] + 382
7   MyApp                              0x000f70e1 -[HomeViewController updateStatusBar] + 1700
8   MyApp                              0x000f61bd -[HomeViewController statusRecieved] + 224
9   MyApp                              0x000cd323 -[CommonClass statusReceivedFromServer] + 142
10  MyApp                              0x000d833d -[CommonClass accountStatus] + 7416
11  Foundation                          0x35a3767d <redacted> + 972
12  libsystem_c.dylib                   0x35c9a311 <redacted> + 308
13  libsystem_c.dylib                   0x35c9a1d8 thread_start + 8

我在堆栈顶部的方法如下:

- (void)orangeGradient: (UILabel *)fillLabel {
@synchronized([CommonClass class]) {
CAGradientLayer * gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = fillLabel.bounds;
gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfbb250) CGColor],(id)[UIColorFromRGB(0xf47c2a) CGColor], nil];
[fillLabel.layer addSublayer:gradientLayer];
}
}

关于为什么会这样以及如何解决这个问题的任何想法?

4

3 回答 3

2

看起来像是orangeGradient:从后台线程调用的。Core Animation 将所有更改分组到 CATransactions 中。通常这是在运行循环中自动完成的。在后台线程上(通常)没有运行循环,因此您必须自己创建事务:

- (void)orangeGradient: (UILabel *)fillLabel {
    @synchronized([CommonClass class]) {
        [CATransaction begin];
        CAGradientLayer * gradientLayer = [CAGradientLayer layer];
        gradientLayer.frame = fillLabel.bounds;
        gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfbb250) CGColor],(id)[UIColorFromRGB(0xf47c2a) CGColor], nil];
        [fillLabel.layer addSublayer:gradientLayer];
        [CATransaction commit];
    }
}

还有另一个问题:UIKit 不是线程安全的。您不能在后台线程上调用boundsa 。UILabel

于 2013-01-02T11:18:01.953 回答
0

检查代码中是否有未提交 CATransaction的. 您将需要按照以下方式执行此操作;

[CATransaction begin];
[CATransaction setDisableActions:YES];
[commonClassObject orangeGradient:lblFill];
[CATransaction commit];

[编辑]

基本上,当 NSOperation 在 CoreAnimation 执行完成之前完成时,就会发生此问题。在您需要弄清楚的代码中的某个地方,这两个类之间必须存在某种关系。

于 2013-01-02T10:47:13.650 回答
0

我将补充一点,我在后台线程中遇到了与 initWithFrame 相同的问题。

似乎从 iOS 7 及更高版本开始,对 UIKit 的某些调用必须在主线程下进行,并且不能从后台线程调用。

另请注意,在多次这样的警告之后,我的应用程序完全停止响应。所以最好不要忽视这样的警告。

于 2014-09-10T13:44:45.733 回答