GObject是Glib库的一部分,提供了一个灵活的、可扩展的、并且容易映射到其他语言的面向对象的C语言框架。以下是GObject的一些核心概念和使用方法。
源码:https://gitlab.gnome.org/GNOME/glib/
教程:https://docs.gtk.org/gobject/index.html
1. GObject的核心概念
- 动态类型系统:GObject允许程序在运行时进行类型注册,这意味着可以使用纯C语言设计一整套面向对象的软件模块。
- 内存管理:GObject实现了基于引用计数的内存管理,这简化了内存管理的复杂性。
- 属性系统:GObject提供了通用的set/get属性获取方法,使得属性管理变得更加简单。
- 信号机制:GObject内置了简单易用的信号机制,允许对象之间进行通信。
2. GObject的使用示例
在GObject中,类和实例是两个结构体的组合。类结构体初始化函数一般被调用一次,而实例结构体的初始化函数的调用次数等于对象实例化的次数。所有实例共享的数据保存在类结构体中,而对象私有的数据保存在实例结构体中。
GObject实例的结构体定义如下:
GObject类的结构体定义如下:
以下是一个简单的示例,展示了如何创建和使用GObject实例:
在这个示例中,g_object_new
函数用于创建GObject实例,并返回指向它的指针。G_TYPE_OBJECT
是GObject基类的类型标识符,所有其他GObject类型都从这个基类型派生。宏 G_OBJECT_GET_CLASS
返回指向参数所属类变量的指针。g_object_unref
用于销毁实例变量并释放内存。
实例1与实例2的存储空间是不同的,每个实例都有自己的空间。两个类的存储空间是相同的,两个GObject实例共享同一个类。
3. GObject的信号机制
GObject允许定义和使用属性,以及发出和连接信号。这些特性使得GObject非常适合用于构建复杂的软件系统,尤其是在需要组件间通信和属性管理的场景中。
信号最基本的用途是实现事件通知。例如:创建一个信号,当调用文件写方法时,触发文件变化信号。
创建信号:
带信号机制的文件写方法:
用户回调处理函数连接到信号:
4. 跨语言互通性
GObject被设计为可以直接使用在C程序中,并且可以封装至其他语言,如C++、Java、Ruby、Python和.NET/Mono等,这使得GObject具有很好的跨语言互通性。