登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: 原来 golang 也有对象的析构函数 runtime.SetFinalizer [golang 对象释放事件]     [回主站]     [分站链接]
标题
原来 golang 也有对象的析构函数 runtime.SetFinalizer [golang 对象释放事件]
clq
浏览(131) + 2024-06-15 12:37:49 发表 编辑

关键字:

[2024-06-15 13:01:46 最后更新]
原来 golang 也有对象的析构函数 runtime.SetFinalizer [golang 对象释放事件]

自动回收 gc 的一大问题就是对象有可能被你不知道的情况下回收掉。比如我们 new 一个对象习惯不去理会它,默认认为它会一直存在,但这在 gc 环境(甚至是现在的 objectc 的 arc 环境)下是要出大问题的。我在 golang 和 objectc 下创建控件时经常犯这个错误,这时候你会觉得怎么 ios/macos 上的控件好奇怪呀 -- 其实那是你创建的控件已经被回收了,虽然在界面上会有时候的确会有一个控件(其实有时候没有)。

这时候最好能知道它什么时候被释放了。

不知道 java 和 objectc 有没有这样的函数/机制。

--------------------------------------------------------
更新,实测成功的 objectc 版本

//2024.6 据说是 objectc 的释放函数/析构函数
-(void) dealloc
{
//[super dealloc]; //arc 下是不能手动调用的
NSLog(@"ClassA destroyed\n"); //确实调用了,当设置对象为 nil 的时候
}//

--------------------------------------------------------
java 中的据说如下,未实测
protected void finalize( )
{
// finalization code here
}

来自 https://blog.csdn.net/jemasw/article/details/8470480
均通过百度关键字 “objectc 释放对象时自动调用什么函数”, “Java 释放对象时自动调用什么函数”,“golang 对象释放事件” 得到。

--------------------------------------------------------
golang 对象释放事件

在Go语言中,垃圾回收器(GC)负责管理内存的分配和释放。你不需要显式地释放对象,GC会在合适的时候回收不再被引用的对象。但是,如果你想要在对象被释放时执行一些操作(例如,关闭文件、解除网络连接等),你可以使用finalizer。

Go语言中创建finalizer的方法是使用runtime.SetFinalizer函数。这个函数接受一个接口值和一个指向任意类型值的指针作为参数。当接口值指向的对象被GC回收时,finalizer函数会被调用。

下面是一个使用finalizer的例子:

package main

import (
"fmt"
"runtime"
)

type Resource struct {
name string
}

func (r *Resource) Close() {
fmt.Printf("Closing resource: %s\n", r.name)
}

func main() {
r := &Resource{"myResource"}

// 设置finalizer
runtime.SetFinalizer(r, func(r *Resource) {
r.Close()
})

// 在这里可以使用资源r

// 当r不再被其他对象引用时,finalizer会被调用
// 可以通过将r赋值为nil来促使GC回收r
r = nil

// 强制进行一次GC
runtime.GC()
}

在这个例子中,我们定义了一个Resource结构体和一个Close方法,当Resource的实例被回收时,Close方法会被调用,输出一条消息表示资源被关闭。我们通过runtime.SetFinalizer设置了一个finalizer,并在main函数的最后将r设置为nil来模拟对象被回收的情形。最后,我们调用runtime.GC()来强制进行一次垃圾回收,以便于测试finalizer的行为。







总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1