Gobject tutorial 一

发布于:2024-06-15 ⋅ 阅读:(138) ⋅ 点赞:(0)

  参考: 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。


网站公告

今日签到

点亮在社区的每一天
去签到