本文主要是介绍Gobject tutorial 一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考: https://github.com/ToshioCP/Gobject-tutorial/tree/main?tab=readme-ov-file
Gobject class and instance
Gobject 实例是通过函数g_object_new创建的。Gobject不仅包含实例还包含类。
- Gobject的类是在第一次调用g_object_new函数时被创建的。并且对于一个特定的对象,类只有一个。
- Gobject的实例是每次调用g_object_new时,都会被创建。因此,实例是可以同时存在多个的。
从广义上来说,GObject是一个包含类和实例的对象。从狭义上来说,GObject仅仅是一个C结构体的定义。
typedef struct _GObject GObject;
struct _GObject
{GTypeInstance g_type_instance;/*< private >*/guint ref_count; /* (atomic) */GData *qdata;
};
g_object_new函数分配一个sizeof(GObject)大小的内存,并进行初始化,函数返回值是指向此分配内存的指针。此分配的内存就是一个GObject实例,也就是说一个GObject实例就是一块内存。同理,GObject 类也是一块由g_object_new分配的内存。
#include <glib-object.h>int
main (int argc, char **argv) {GObject *instance1, *instance2;GObjectClass *class1, *class2;instance1 = g_object_new (G_TYPE_OBJECT, NULL);instance2 = g_object_new (G_TYPE_OBJECT, NULL);g_print ("The address of instance1 is %p\n", instance1);g_print ("The address of instance2 is %p\n", instance2);class1 = G_OBJECT_GET_CLASS (instance1);class2 = G_OBJECT_GET_CLASS (instance2);g_print ("The address of the class of instance1 is %p\n", class1);g_print ("The address of the class of instance2 is %p\n", class2);g_object_unref (instance1);g_object_unref (instance2);return 0;
}
上述程序运行结果如下:
The address of instance1 is 0x55b28a0d2a00
The address of instance2 is 0x55b28a0d2a20
The address of the class of instance1 is 0x55b28a0d2830
The address of the class of instance2 is 0x55b28a0d2830
即:instanace1 和instance2所指代的内存位置不同,因此是两个不同的instance,但是二者所属的类的地址是一致的。因此证明,对于所有的GObject类型的实例,其类只有一个。
在上例中,G_TYPE_OBJECT就是Gobject的类型,在glib 源码中你会发现g_object_new的声明如下:
gpointer g_object_new (GType object_type,const gchar *first_property_name,...);
在Gobject中存在一个类型系统,类型系统属于Gobject的一个基础系统。每个数据类型都必须在类型系统中进行注册。
Reference Count
由于一个Gobject实例占据一段内存,当实例不再使用时,需要释放此段内存,那么,问题来了,怎么确认一个实例在用还是没有用了? reference count就是来解决这个问题的。
如果一个创建出来的Gobjet实例同时被A和B使用,此时,reference count 的值就是2.当A或B使用同一个Gobject实例时,都会调用g_object_ref,使对象的reference count增加1,不使用时,都会调用g_object_unref,使对象的reference count减1.当Gobject实例的reference count值为0时,表示
此实例不再使用,实例就会自动销毁。调用g_object_new生成Gobject 实例时, 此实例的reference count 值为1。
这篇关于Gobject tutorial 一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!