标题
原来 golang 也有对象的析构函数 runtime.SetFinalizer [golang 对象释放事件]
clq
浏览(164) +
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的行为。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.