在基于前端技术的编辑器中，ObjectURL 的生命周期如何管理？
最近在重写自己的网站上的图片编辑器，顺便从框架写起。

编辑器中对本地添加的图片素材以 `URL.createObjectURL()` 生成的 URL
来引用。但是这样生成的链接引用的文件会常驻内存而不会自动回收，需要 `URL.revokeURL`来释放。

目前我能想到的方法是“引用计数”，也就是 **每次复制此类链接的时候，引用加一，引用归零之后触发释放**
。理论上行得通，但实际上很难约束开发者触发它的计数事件（因为它只是一个字符串），尤其在实现撤销和重做的时候。

我想知道大家有没有解决类似问题的经验？或者有没有更好的想法？或者是否应该直接放弃管理、把问题抛给浏览器和用户？
包装一下 resource { private blob, public getObjectUrl() } ，注册到全局 registry 上。

然后编辑器每个 commit 都需要声明对 resource 的引用，在编辑器 commit 的创建、丢弃、合并等时机上对 resource引用计数进行增减。

resource 引用计数为 0 时， private blob 设为 null，撤销 objectUrl ，并且从 registry 里删除自身，等待gc 。

问题1： objectUrl 是字符串，如果有 xx 业务使用了失效的 objectUrl 导致资源加载出错怎么办？

答：不用担心，跟业务的约定是使用 resource ，且 resource 生命周期很好排查。如果业务破坏了这个约定，使用了已经失效的 objectUrl，算是业务的 bug 。

问题2：如果业务引用了失效的 resource 怎么办，会不会造成内存无法释放呢？

答：所以 blob 要设为 private ，且要在清理时设为 null 。就算有业务引用了已经失效的 resource 导致无法彻底 gc，也只是一个空对象而已，真实的 blob 还是会 gc 的。