我的代码片段如下。这会导致应用程序崩溃。奇怪的是,当我创建存档并在我的设备上加载存档时,应用程序才会崩溃。如果我直接从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
有关如何解决此问题的任何想法?我显然可以摆脱动画,但我想保留它。
答案 0 :(得分:1)
1:将您的逻辑置于动画块中,反之亦然。
SIGSEV
表示您的程序尝试在为其分配的内存之外读取或写入。我很难在你的代码中看到它的原因。因为你创建了大量的同步动画,所以我可以使用标签,或者动画的范围会以某种方式混淆。
2:您的Alpha更改代码......
label.alpha = 0.0f;
label.alpha = 1.0f;
...因为您在同一动画中更改了alpha,所以不会有任何影响 如果您不想将其设置回1.0f,请在完成块中执行此操作。
答案 1 :(得分: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) {
...
}
}];