内存泄漏 — 来自 `self.watch(other, ...)` / `data_bind` 的监视器在拥有者从 DOM 中移除时不会被删除
□ 这只虫
如果一个短命的部件会‘自.watch'(some long live object,"atr",.)'——例如. `self.watch(self.app,"theom",.)'——部件及其整个子树在之后永远不会被放出. 只要观测到的属性不再改变,部件将被删除。
监视器条目(自己,召回)'被储存在**观测到的**物体的观察者'`['atr']上。
它只在“Reactive. check watchers”中被挤出,在观测到的反应变化**时运行:
监视器 [:] = [
(反应,召回)
对于可反应的,在监视器中召回
如果无法反应。 关闭
[ . ]因此,如果观测到的属性是稳定的,监视器(以及它引用的部件)将永远地留在长生物体上.
• 具体实例(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