0

私のコードスニペットを以下に示します。これにより、アプリがクラッシュします。不思議なことに、アーカイブを作成してデバイスにアーカイブをロードした場合にのみアプリがクラッシュします。XCodeから直接デバイスで実行すると、正常に実行されます。

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 12; j++) {
        UILabel *label = (UILabel *)[self.view viewWithTag:((j+1) * 10 + (i+1))];
        [UIView animateWithDuration:1.0
                         animations:^{
                             label.alpha = 0.0f;
                             label.text = [cryptograms objectAtIndex:i * 12 + j];
                             label.alpha = 1.0f;
                         }];
    }
}

ただし、次のコードスニペットを使用してアーカイブを作成すると、正常に機能します。

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 12; j++) {
        UILabel *label = (UILabel *)[self.view viewWithTag:((j+1) * 10 + (i+1))];
        [label setText:[cryptograms objectAtIndex:i * 12 + j]];

    }
}

問題はアレイのサイズではないことを確認しました。配列には常に96個の要素があります。クラッシュログには次のように表示されます。

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000017
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x37148584 _cache_getImp + 4
1   libobjc.A.dylib                 0x37148fa0 lookUpMethod + 24
2   libobjc.A.dylib                 0x3714a1e2 class_respondsToSelector + 26
3   CoreFoundation                  0x382c3638 ___forwarding___ + 372
4   CoreFoundation                  0x3821b204 _CF_forwarding_prep_0 + 20
5   GridSoftToken                   0x000990ae __41-[ViewController updateCryptogramLabels:]_block_invoke_0 (ViewController.m:69)
6   UIKit                           0x375bae80 +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:animations:start:completion:] + 492
7   UIKit                           0x37672172 +[UIView(UIViewAnimationWithBlocks) animateWithDuration:animations:] + 54
8   GridSoftToken                   0x0009903c -[ViewController updateCryptogramLabels:] (ViewController.m:66)
9   GridSoftToken                   0x00098dc2 -[ViewController viewDidAppear:] (ViewController.m:44)
10  UIKit                           0x3760b2c8 -[UIViewController _setViewAppearState:isAnimating:] + 132
11  UIKit                           0x37627f24 -[UIViewController _executeAfterAppearanceBlock] + 48

Any ideas on how I can troubleshoot this issue ? I can obviously get rid of the animation, but I would like to keep it in place.

4

2 に答える 2

1

1:ロジックをアニメーション ブロックに配置し、その逆は行わないでください。

SIGSEVプログラムが、割り当てられたメモリの外部で読み取りまたは書き込みを試みていることを意味します。あなたのコードでその理由を見るのは難しいです。私はタグを持っている可能性があり、またはアニメーションの範囲が何らかの形で混同されている可能性があります。

2:あなたのアルファチェンジコード...

label.alpha = 0.0f;
label.alpha = 1.0f;

...同じアニメーションでアルファを変更するため、影響はありません。
1.0f に戻したくない場合は、完了ブロックでそれを行います。

于 2012-11-12T21:34:36.297 に答える
0

アニメーションブロック内にロジックを配置するという@yinkouの提案を使用して、コードを作り直しましたが、問題なく実行されるようになりました。参考のために、以下の改訂されたコードを添付してください。うまくいけば、それは他の誰かを助けるでしょう。なぜこれが機能するのか、以前のバージョンが機能しないのかはまだわかりませんが、@ yinkouが提案したように、多数の同時アニメーションと関係があるのか​​もしれません!!

[UIView animateWithDuration:1.0
                 animations:^{
                     for (int i = 0; i < 8; i++) {
                         for (int j = 0; j < 12; j++) {
                             UILabel *label = (UILabel *)[self.view viewWithTag:((j+1) * 10 + (i+1))];
                             [label setAlpha:0.0f];
                             [label setText:[cryptograms objectAtIndex:i * 12 + j]];
                             [label setAlpha:1.0f];
                         }
                     }
                 } completion:^(BOOL finished) {
                     if (finished) {
                         ...
                     }
                 }];
于 2012-11-13T14:35:10.927 に答える