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はスレッドセーフではありません。バックグラウンドスレッドでをbounds呼び出すことはできません。UILabel

于 2013-01-02T11:18:01.953 に答える
0

コード内のどこかにコミットされていない CATransactionものがあることを確認してください。この操作は次のように実行する必要があります。

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

[編集]

基本的に、この問題は、CoreAnimationの実行が完了する前にNSOperationが完了したときに発生します。あなたがそれを理解する必要があるあなたのコードのどこかでこれらの2つのクラスの間に何らかの関係がなければなりません。

于 2013-01-02T10:47:13.650 に答える
0

バックグラウンドスレッドからのinitWithFrameでも同じ問題が発生したことを付け加えておきます。

iOS 7以降では、UIKitの一部の呼び出しはメインスレッドで実行する必要があり、バックグラウンドスレッドから呼び出すことはできないようです。

また、このようないくつかの警告の後、私のアプリは完全に応答しなくなったことにも注意してください。したがって、そのような警告を無視しない方がよいでしょう。

于 2014-09-10T13:44:45.733 に答える