首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定到数组值的动画导致EXC_BAD_ACCESS

绑定到数组值的动画导致EXC_BAD_ACCESS
EN

Stack Overflow用户
提问于 2022-03-08 14:49:49
回答 1查看 96关注 0票数 1

我有一个swiftUI视图,它有许多动画,这些动画被绑定到一个结构数组中。当我在手机上测试这个应用程序时,我就会得到EXC_BAD_ACCESS。这就是backtrace顶部的样子:

代码语言:javascript
复制
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x16f7cfff0)
    frame #0: 0x00000001892665c8 SwiftUI`SwiftUI.DefaultCombiningAnimator.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 48
    frame #1: 0x00000001892fac40 SwiftUI`SwiftUI.AnimatorBox.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 168
    frame #2: 0x0000000189264a28 SwiftUI`SwiftUI.AnyAnimator.value(in: τ_0_0, for: Swift.Double) -> Swift.Optional<τ_0_0> + 156
    frame #3: 0x0000000189266898 SwiftUI`SwiftUI.DefaultCombiningAnimator.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 768
    frame #4: 0x00000001892fac40 SwiftUI`SwiftUI.AnimatorBox.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 168
    frame #5: 0x0000000189264a28 SwiftUI`SwiftUI.AnyAnimator.value(in: τ_0_0, for: Swift.Double) -> Swift.Optional<τ_0_0> + 156
    frame #6: 0x0000000189266898 SwiftUI`SwiftUI.DefaultCombiningAnimator.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 768
    frame #7: 0x00000001892fac40 SwiftUI`SwiftUI.AnimatorBox.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 168
    frame #8: 0x0000000189264a28 SwiftUI`SwiftUI.AnyAnimator.value(in: τ_0_0, for: Swift.Double) -> Swift.Optional<τ_0_0> + 156

前面的4000个帧都重复了相同的AnyAnimator / AnimatorBox / DefaultCombiningAnimator序列。我唯一能看到的区别是,在第0帧中,DefaultCombiningAnimator以'-> Swift.Optional<τ__0.Value> + 48‘结尾,而不是'+ 768’。

有人能告诉我(如果有的话)这告诉我什么吗?基础数组不断更新,但保持固定大小,不添加或删除。

这是动画视图元素:

代码语言:javascript
复制
          ZStack {
            //MARK: - Fret Cents Label
            NoteLabel()
              .fill(activeFret == thisFret ? .white : intonationModel.gString[thisFret].hasBeenSet ? .black : .gray)
              .opacity(0.8)
              .shadow(color: .black, radius: 4, x: 0, y: 3)
            
            VStack(spacing: 0) {
              Text(String(format: "%.1f", cents))
                .font(Font.custom("Karantina-Regular", size: scaleHeight * 0.06))
                .foregroundColor(activeFret == thisFret ? .black : .white)
            }
            
          }
          .frame(width: width * 0.9 , height: scaleHeight * 0.1)
          .position(x: width * 0.6, y: scaleHeight * 0.5)
          .offset(y: yScaleCents * abs(cents) <= 10 ?
                  scaleHeight * (yScaleCents * 0.05 * -cents) :
                    scaleHeight * 0.5 * -(abs(cents) / cents))
          .animation(.easeInOut(duration: 0.2), value: cents)

这是父视图中调用它的地方:

代码语言:javascript
复制
              ForEach($intonationModel.gString.indices, id: \.self) { index in
                let columnWidth = fretWidth + (120 / (CGFloat(index + 1) * 4))
                if index > 0 {
                  VStack(spacing: 0) {

                    IntonatorChartColumn(
                      thisFret: index,
                      scaleHeight: scaleHeight,
                      scaleMargin: scaleMargin,
                      fretboardHeight: fretboardHeight,
                      fretLabelHeight: fretLabelHeight,
                      yScaleCents: self.yScaleCents,
                      stringGap: stringGap,
                      showFretboard: $showFretboard,
                      cents: $intonationModel.gString[index].cents,
                      note: $intonationModel.gString[index].closestNote,
                      octave: $intonationModel.gString[index].octave,
                      activeFret: $intonationModel.currentFret
                    )
                      .frame(width: columnWidth)
                    .id(index)
                  }
                  .padding(.top, topMargin)
                }
              }

当我在寻找僵尸的时候,这个应用拒绝崩溃,尽管它在不被监控的时候会可靠的崩溃。我将重新编写代码,以避免索引的使用(如jnpdx所建议的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-30 08:59:21

我相信这里发生了两件事。

  1. ,它似乎是在更新动画视图,即使在后台也是如此。确保只在视图处于前台时才更新已发布的变量,以阻止崩溃。
  2. ,我已更改为

的ForEach的错误使用

代码语言:javascript
复制
ForEach(Array(zip(intonationEngine.gString.indices, intonationEngine.gString)) , id: \.0) {index, note in

自从这样做之后,崩溃就停止了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71396944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档