问题标签 [deinit]

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 投票
3 回答
343 浏览

swift - Swift:初始化抛出时如何释放属性?

此示例代码存在内存泄漏。

指针 1和指针2在 Person 初始化成功之前分配。如果init函数抛出错误。该deinit函数永远不会被执行。所以pointer1pointer2永远不会被释放。

有时逻辑非常复杂。在我的真实案例中。有很多allocatethrowsifguard。有些很难控制。

有没有办法避免这种内存泄漏?

这是一个类似的问题:https ://forums.swift.org/t/deinit-and-failable-initializers/1199

0 投票
1 回答
38 浏览

ios - 通过 UIStoryboard.instantiateViewController 初始化的 UIViewController 在设置为 nil 时不会在单元测试期间取消初始化

我无法弄清楚为什么用 UIStoryboard.instantiateViewController 实例化的 UIViewController 在单元测试中初始化时不会取消初始化

这是我希望 deinit 但没有的代码:

结果是:

当 UIViewController 以编程方式初始化时,它将正确地取消初始化

结果:

有任何想法吗?

0 投票
1 回答
22 浏览

arrays - 以不同方式创建数组时,反初始化顺序不同

TL;DR:为什么,当数组与初始值一起创建时,值会立即取消初始化,但在创建数组后填充数组值会产生不同的行为?


我在 JavaScript 之后学习 Swift,它有 GC,所以 ARC 和反初始化的概念对我来说有点新手。为了更深入地理解它,我根据官方文档中的示例编写了以下代码:

当我使用现有用户实例 () 创建数组时array = [value, value],取消初始化会在分配给nil( array[0] = nil) 之后立即发生:

…但是当我第一次创建一个空数组然后用值(array = []; array[0] = value; array[1] = value)填充它时,反初始化会在稍后的某个随机点发生:

从编译器的角度来看有什么区别?这种差异的原因是什么?

0 投票
1 回答
42 浏览

swift - 测试 UINavigationController 释放失败?

我有以下单元测试:

最后两个断言失败了。有什么方法可以可靠地测试 UIViewController 和 UINavigationController 的释放吗?

0 投票
1 回答
32 浏览

swift - 作为参数传递的 ViewController 未被取消初始化(Swift)

设置: 我有一个ViewController ProblemViewclass A。我通过ProblemView了课堂A,所以我可以继续努力。它看起来像这样(简化):

问题:每当我在应用程序中重新启动此进程时,内存每次都会增加,直到出现内存错误。

我尝试了什么:我添加deinit到两个课程中。class A总是被取消初始化但class ProblemView 不是(这可能是问题吗?)。我还发现,当我不在workOn全局范围内而是在passView函数内声明时,它工作得很好。但是我需要全局变量,因为我在A. 什么可能是这个问题的解决方案或解决方法?

0 投票
1 回答
620 浏览

ios - 在 deinit 中的 NotificationCenter.default.removeObserver(self),为什么 deinit 它甚至被调用?

从 ios 9 开始,没有必要从通知中心取消订阅,因为 ios 会自动处理这个,但在 ios 9 之前,开发人员必须手动调用NotificationCenter.default.removeObserver(self)以避免内存泄漏和常见的地方是(在很多教程中都建议)和 Stackoverflow 帖子)deinit。所以,我的问题是 - 如何使用deinit从通知中注销deinit只在对象释放之前调用,所以它的引用计数应该是 0,但肯定不是 - 因为我们仍然订阅通知中心。实现这一点的唯一可能方法似乎是使用弱引用,基本上如果通知中心弱引用对象,上述情况是可能的,但在这种情况下,根本不需要取消订阅,因为对象可以很容易地被释放。有人可以澄清一下这是如何工作的。

0 投票
2 回答
160 浏览

swift - deinit 没有被调用。帮我解决这个问题

我的预期答案是“Hellow,World!处理程序正在被取消初始化。” 如何解决这个问题?我只想更改一行代码,而不是整个代码。

0 投票
2 回答
228 浏览

swift - 什么时候准确地调用了`deinit`?(在斯威夫特)

具体什么时候deinit调用?

当最后一个引用超出范围(通过返回、抛出或退出)时,是否C++保证被调用?

或者正在Swift使用垃圾收集器?

0 投票
1 回答
471 浏览

swift - 无法形成对类实例的弱引用 - Swift 错误

我收到错误消息:

objc [12772]:无法形成对 appName.ViewController 类的实例 (0x137d65240) 的弱引用。该对象可能被过度释放,或者正在被释放。

我觉得这很奇怪,因为这只有在我添加了一个按钮单击以通过实例化将用户带到这个 UIViewController 之后才发生。再次运行应用程序后,错误消失了,因此仅当用户从按钮进入此 UIViewController 时才会发生这种情况。

有没有人知道是什么导致了这个问题?

呈现视图控制器的代码:

0 投票
0 回答
165 浏览

ios - 在 iOS 15 中,Deinit 未调用 UIViewController

它是我的空项目,有两个 UIViewController,没有强引用:

应用委托:

启动VC:

主VC:

主故事板

单击按钮后重新加载窗口(MainVC) deinit 未在iOS 15上调用,但在iOS 14.4上它OK

iOS 14.4 控制台:

iOS 14.4

iOS 15 控制台:

iOS 15

我在 MacOS Big Sur 上使用 Xcode 13 beta 5 和 iPhone 模拟器。