【问题标题】:Typescript (Angular2): Passing objects to functions -> possible memory leaks?打字稿(Angular2):将对象传递给函数->可能的内存泄漏?
【发布时间】:2017-09-23 15:39:16
【问题描述】:

我已经读过,在 javascript 中将对象作为参数传递(也在 Typescript 中继承)时,它是通过引用传递的。

这可能会导致内存泄漏吗?

让我们假设一个场景:

  1. 以下组件,执行 saveCustomerInfo 函数
  2. 然后该函数将对象推送到数组中。
  3. 组件被销毁。

@Component({
    selector: "customer-details",
    templateUrl: "../html/customerDetails.template.html"
})
export class CustomerDetailsComponent {
  customerData: Customer;

  constructor(private customerService: CustomerService): void {}
 
  saveCustomerInfo(): void {
    this.customerService.saveCustomer(this.customerData);
  }
}

这不会导致内存泄漏吗,因为服务现在保存了组件属性的引用,不允许组件被垃圾收集?

无论如何,此类调用的最佳做法是什么?我们应该只传递函数内部通过“let”声明的临时对象还是传递由 Object.create() 创建的克隆?

非常感谢您,

迪米特里斯

【问题讨论】:

  • 试试customerData: new Customer();

标签: javascript angular object memory-leaks pass-by-reference


【解决方案1】:
@Component({
    selector: "customer-details",
    templateUrl: "../html/customerDetails.template.html"
})
export class CustomerDetailsComponent {
  customerData: Customer;

  constructor(private customerService: CustomerService): void {}

  saveCustomerInfo(): void {
    this.customerService.saveCustomer(this.customerData);
  }
}

在您的示例代码中,根据您在其余问题中的描述,我假设 customerService.saveCustomer(customerData) 调用最终将其参数 (customerData) 放入内部数组中。

这正确地意味着 customerData 对象不会被垃圾收集,因为现在您的 customerService 对象具有对它的引用。然而,虽然 customerData 对象不能被垃圾回收,但 CustomerDetailsComponent 的其余部分可以毫无问题地被垃圾回收 - 其他人引用其内部属性之一的事实意味着特定属性不会被标记为垃圾回收,但对象的其余部分仍准备好进行垃圾回收(假设没有其他人持有对组件本身的引用)。

【讨论】:

  • 你的假设是正确的,让我们假设它将它保存在一个数组中或将它保存在另一个内部属性中。即使是针对一个 Component 属性,在不产生内存泄漏的情况下保存此对象的最佳方法是什么?我应该在每个接受复杂类型参数的函数上使用 Object.create 吗?
【解决方案2】:

“当 Angular 看到 DOM 中不再需要某个组件时,它会销毁该组件。”

基本上,当不需要该组件时,会调用 ngDestroy()。

在这种情况下,您实际上可以通过在组件上实现生命周期挂钩来测试组件是否被销毁,像上面那样进行调用,然后移动到组件不在的新视图中DOM。

组件应该被销毁就好了。

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多