#6666·textual

内存泄漏 — 来自 `self.watch(other, ...)` / `data_bind` 的监视器在拥有者从 DOM 中移除时不会被删除

作者: cdxjcl创建于 2026年7月22日更新于 2026年8月24日

□ 这只虫

如果一个短命的部件会‘自.watch'(some long live object,"atr",.)'——例如. `self.watch(self.app,"theom",.)'——部件及其整个子树在之后永远不会被放出. 只要观测到的属性不再改变,部件将被删除。

监视器条目(自己,召回)'被储存在**观测到的**物体的观察者'`['atr']上。 它只在“Reactive. check watchers”中被挤出,在观测到的反应变化**时运行:

zz
监视器 [:] = [
(反应,召回)
对于可反应的,在监视器中召回
如果无法反应。  关闭
[ . ]

因此,如果观测到的属性是稳定的,监视器(以及它引用的部件)将永远地留在长生物体上.

• 具体实例(Footer)

Footer.compose'将FooterKey'部件建有.data bind(compact=Footer.compact)'。 data bind' calls self.watch(footer, "compact",.)',存储条目(footerKey, cb)'** 长寿命的Footer'(被观测到的物体),在Footer. watchers['compact]'中。 所以,即使一个 " FooterKey " 被丢弃, " Footer " 上是 " Footer " 的入口。

footer.on mount'订阅bonders-changed'为screen.bonders- update signal'。' 这个信号是 由Screen.rerefresh bondings ()'出版,其中反应.'在****任何**反应时引用。 约束'= " 真理 " 旗帜的改变,包括 " 侧重 " 每一重点行动。 关键是它会起火 ** 不论约束性套件是否实际不同**,因此约束-更改'在重构' 每一个焦点/屏幕变化(这正是为什么需要一个去弹跳的后卫来压制不-op重构).

" 重编 " 丢弃了旧的 " FooterKey " 并建造了新的 " FooterKey " ,每个都登记了新的 (FooterKey,cb)Footer. 观察者[契约']上输入'。 由于`Footer.compact'本身很少 修改后,观察者名单会增加一个 " FooterKey " / " foooters-changed " ,泄露每个旧的 长生不老的 " FooterKey " (及其 " Label " / " Strip " 子树)。

最小示例

[Python] 从正文. app导入 App, ComposeResult 从正文. widgets 导入页脚, 标签

类 LeakApp( App) : BINDINGS = [("a","dummy","do a", ("b","dummy","do b")].

def 作曲( 自己) - > 作曲续集 : 表示标签( 聚焦我) 产量页脚( )

def 在 mount(自)- > 无: 自动. set interval( 0 1, 自周期 焦点)

f 周期 焦点( 自身) - > 无:

将焦点放在部件之间触发 App. focus (绑定=True reassive) 到

更改, 它会出版 Screen. 绑定 更新 signal - > 页脚。 绑定 已更改

#-> 重新编译, 每次注册一个新的脚步监视器; 旧脚步监视器

对象永远不会被放出( 契约很少改变, 因此 watchers 永远不会被放出) 。

标签=自定义(标签) 标签。焦点( ) 自显示屏。 聚焦 next( )

如果... 名字... "... main...": 漏出App (. run () ) (中文(简体) ).


为观察漏出,仪器活出 " Footer " (如:
. . . . . . .

内容来源: Textualize/textual