问题标签 [reswift]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5633 浏览

ios - 堆栈溢出:线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16d09aa00)

崩溃描述

最近,我在我的一个 iOS/Swift 项目中遇到了非常奇怪的内存问题。我真的不确定发生了什么,感觉也不太容易描述,但无论如何我会尽力而为。

它的行为基本上如下:

  • 在某个代码库上,崩溃总是发生在同一个地方(100% 可重现)
  • 对代码库的更改可能会解决问题,但它也可能只是在其他地方弹出
  • 崩溃只发生在真实设备上,从不在模拟器内

目前该应用程序因以下错误而崩溃(3 次不同运行的结果):

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16d09aa00)

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16af46a00)

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16d526a00)


关于内存地址的推理

WWDC 会议

我从 WWDC 2018 中发现了一个有趣的会话(了解崩溃和崩溃日志),其中一个人指出,有时可以从特定的内存地址中获取更多信息,从而发生崩溃。

不幸的是,它在我的应用程序中崩溃的地址有些完全不同,但也许我们可以从它们那里得到线索?至少有趣的是,它们都非常相似,不是吗?

由于启用了诊断选项而导致的更改

进一步调查表明,前 2 个字节 (16) 始终保持不变,然后是 4 个随机字节,然后是 3 个字节 (a00)。当激活诊断(例如 ASan 或 Scribble)时,最后 3 个字节发生变化(例如 3a0 或 9e0)。但也许这只是由于添加了更多“调试内容”而导致的一种转变?我真的不是那个“记忆人”,但只想提供我注意到的任何东西。


尝试“诊断选项”

我尝试了不同的诊断选项(来自方案),但它们都没有真正以任何方式改变崩溃,也没有提供更多信息。

1. 涂鸦

崩溃不引用 0xAA 或 0x55,所以使用 Scribble 没有什么可以捕获的?( Xcode - scribble, 保护边缘和保护 malloc )

2. Malloc 保护边缘

使用它也没有注意到任何区别。

3.僵尸

使用本指南

malloc_info --type 0x16b15e9c0

错误:错误:试图将堆栈放入不可读的内存中:0x16b15e920。

4.阿桑

使用 ASan 只需将以下条目放在堆栈跟踪的顶部。不幸的是,我没有发现任何与此相关的有用信息。

#0 0x0000000109efbf60 in __asan_alloca_poison ()

5. 桑

在真实设备上不可用(崩溃只发生在那里)


递归/BOF?

可能是递归太长,还是另一种堆栈/堆缓冲区溢出?但似乎真实设备和模拟器上的堆栈大小与524288字节(从Thread.main.stackSize)完全相同。

那么,由于它不会在模拟器中崩溃,所以它不是 BOF?还是架构差异太大,无法在这里得出这样的结论?


拆卸

我也尝试过“拆卸”。

disassemble -a 0x16d09aa00

错误:找不到地址 0x16d09aa00 的函数边界

或者disassemble -frame

但是我的汇编技能真的很落后,所以目前我无法从这些信息中得到任何信息。


需要帮忙

如您所见,我真的没有想法了。要么崩溃真的很奇怪,要么我没有足够的知识/技能来使用上述工具,让我更接近这些问题的原因。

无论哪种方式......任何帮助,提示,想法或任何可以指出我正确方向的东西都非常感谢!

提前谢谢各位。


2020 年 5 月 19 日更新

我完全忘了提到,我们在我们的应用程序中大量使用ReSwift,我猜崩溃似乎与我们在那里使用中间件的方式有关。

我也已经与那里的开发人员取得了联系:github.com/ReSwift/ReSwift/issues/271

最后是一些代码。不幸的是,我不能分享所有的应用程序代码(这可能是必要的!?),也不想让你用太多的代码来超载你。

当前的问题

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x16ed82da0)

UserAccountMiddleware.swift

注意:使用这些DispatchQueue.main.async实际上会使崩溃消失。他们确实打破了当前的循环,所以也许发生了某种递归或时间问题?

ReSwift Store.swift

Xcode 控制台:

汇编程序(崩溃的最后一步):

0 投票
0 回答
179 浏览

swift - 如何使用 Firestore 对数据进行分页?

我想用 Firestore(Firesnapshot 和 Resiwft)对我的查询进行分页。正如谷歌文档中描述的那样,我只是找不到方法或无法做到这一点。

0 投票
0 回答
18 浏览

javascript - 我应该如何在 redux 中处理到相同状态的不同转换?例如,我希望对状态更改进行动画处理,但只是有时

背景

我是一名 iOS 开发人员,但我想在任何平台上利用 redux 专家的专业知识——我开始使用 ReSwift 来使用 redux,但我很难找到一个似乎很常见的问题的解决方案。

问题

我有一种情况,我的列表中有一堆城市存储在状态中。当用户拖动以重新定位城市时,我们会发送一个重新排序操作来正确调整状态。

但是,我们需要 UI 知道重新排序的 from 和 to 位置。所以现在我们也将最近的重新排序操作的从/到位置存储在状态中。这似乎是 redux 的反模式——有更好的方法吗?

基本问题

当有多种方式可能导致相同的状态时,您应该如何最好地向视图/订阅者传达有关如何执行状态更改的信息?

更简单的例子

一个更简单的示例是,如果您想在某些情况下显示更改动画,而在其他情况下显示非动画更改。您可能希望shouldAnimate在操作中支持一个参数,但这实际上不是状态,它是关于您转换到一个状态。

我可以通过保持一个状态来解决这个问题lastStateChangeIsAnimated- 甚至只是最后一个动作本身 - 但这似乎我正在围绕 redux 工作。

谢谢你的帮助!!

0 投票
0 回答
40 浏览

swift - 线程 1:信号 SIGABRT 因为 NavigationView -> List -> Section 中的按钮

从 Xcode 12 开始,我有一个Thread 1: signal SIGABRT,这里是错误的详细信息:

2020-10-20 00:01:20.989409+0200 App[23604:1417143] 前置条件失败:导入的节点在读取其值之前被删除:90

当我快速更改选项卡时会出现崩溃。

我认为崩溃来自 ReSwift,但经过调查,当我评论按钮时,崩溃消失了(我试图只评论调度,但应用程序仍然崩溃)。这是代码:

我不明白为什么这个按钮会引发这样的崩溃。

先感谢您。

0 投票
0 回答
37 浏览

swift - 仅在使用 Swift Redux 调用 API 后呈现视图控制器

我正在使用 ReSwift,我想知道仅在进行 API 调用(通过中间件)之后才显示视图控制器(在某些条件下)的最佳做法是什么?

我做了什么:

我有两个视图控制器 VC_1 和 VC_2

在 VC_1 中,当用户单击一个按钮时,我将一个动作发送到一个 thunk/中间件。它将异步处理该操作(通过联系工作人员),并在决定是否应呈现 VC_2 后更新状态中的布尔值。

在我的 VC_1 的 newState(_:) 委托函数中,我检查布尔值,如果它等于 true,我将呈现 VC_2。

但问题是我需要在我的 VC_1 的 viewWillAppear 中订阅商店通知。所以每次视图出现时都会调用 newState() 函数,它会导致每次视图出现时都会显示视图控制器,但我当然不希望这样..

处理此问题的最佳方法是什么?

谢谢!