当前位置: 首页 > 知识库问答 >
问题:

Deinit未调用-找不到某些东西保留的原因(已提供代码)

仲孙经赋
2023-03-14

我发现在以下场景下,我的UIViewcontroller没有调用deInit()。我正在使用这个代码扩展,通过添加敲击手势识别器来使我的生活更轻松。

https://gist.github.com/Saoudrizwan/548AA90BE174320FBAA6B3E71F01F6AE

我在我的一个风险投资公司中使用了这段代码,我把它精简到了最小的代码量:

viewdidload()中,我执行了以下操作:

// When the user taps on a label, have its related textbox automatically get the caret so they can type
// Add tapping so when you tap on a label it makes the corresponding textbox first responder
lblSubject.addTapGestureRecognizer {
 self.txtSubject.becomeFirstResponder()
}

这一行似乎是:

self.txtSubject.becomeFirstResponder()

问题是--当我在闭包中留下上面的这一行时,deinit()不会在我的VC中调用。当我取出上面的行或用类似print(“Hello World”)deInit()的东西替换它时,会正确地调用。txtSubject是@IBOutlet弱var txtSubject:uitextfield!

我不完全确定在这里做什么。我读到,当您触发becomefirstresponder()时,调用regish firstresponder()是很重要的,但即使我没有点击标签(这样就不会给becomefirstresponder()连调用的机会),我仍然无法点击deinit()

有什么我可以看得更远的地方吗?

非常感谢。

共有1个答案

法景明
2023-03-14

这是一个典型的保留循环。闭包中的self.提醒您考虑这一点。我假设self保留了LBLSubject,并且(通过一个objc_association_retrain关联的键),LBLSubject保留了self,因为它被这个闭包捕获。

但是,这里并不需要self。您只需要txtsubject。所以你可以捕捉到:

lblSubject.addTapGestureRecognizer { [txtSubject] in
    txtSubject.becomeFirstResponder()
}

或者,您可以回到巨大的弱自锤子(尽管这往往被过度使用):

lblSubject.addTapGestureRecognizer { [weak self] in
    self?.txtSubject.becomeFirstResponder()
}

探索这类bug的最好方法是使用Xcode的内存图。

回顾一下关于自动引用计数的Swift文档也是一个好主意。

 类似资料:
  • 问题内容: 我使用 CMake* (3.4.1)根据 Boost 库构建一个C ++项目。宿主平台是 Linux ,目标是宿主和 交叉构建 Android NDK。 * 我只使用Boost头文件,而我只是下载/提取了boost文件夹(并且我没有目录)。 在我的文件中,我这样声明对Boost的依赖关系: 我将构建配置如下: 这实际上 可以 像我的 本机 版本一样工作。 现在,当我以完全相同的方式(仅

  • 这是我的片段: Java中的inputText片段: 原因:java.lang.IllegalStateException:Fragment de.company.android.inputtext.InputTextFragment没有创建视图。在Android.app.fragmentManagerimpl.oncreateView(fragmentManager.java:2253),在An

  • 我正在通过https://www.influxdata.com/blog/getting-started-python-influxdb/留档来查询Python的InspxDB。 我能够创建数据库: 另外,我还在数据库中发送数据: 调用json主体为: 但是很快,我想从数据库中查询指标: 此查询导致错误: 文件ipython-inport-31-6e47204db16b,第1行,在模块client

  • 我有一个碳/石墨堆栈与一些非常基本的保留模式设置。除了一些统计数据之外,这些保留期工作得很好--这些似乎只持续一周。 我的存储-schemas.conf: 在受影响的.wsp上使用whisper-info.py会显示以下内容: 有人能提出我可能错过的什么吗?

  • 我已经安装了boost库,它们位于中。我认为问题与可执行文件只在它所在的目录中查找有关,因为当我在其中粘贴'libboost_atomic.dylib'时,它不再介意它了。不幸的是,它抱怨找不到下一个boost库。 有没有一个简单的方法来解决这个问题?

  • 我已经安装了boost库,它们位于中。我认为这个问题与可执行文件只在它所在的目录中查找有关,因为当我将'libboost_atomic.dylib'粘贴在那里时,它不再介意它了。不幸的是,它抱怨找不到下一个boost库。 有什么简单的方法可以解决这个问题吗?