- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GObject 库的文档非常详细。很难弄清楚创建实体的目的。即,我没有得到 GValue
的角色, GTypeValueTable
, GTypeInfo
, GParamSpec
和 TypeData
.
简而言之,类型注册的过程如下。每种类型由 TypeNode
表示结构体。 TypeNode
有2个存储结构:static_fundamental_type_nodes array
用于存储 TypeNodes
静态基本类型和static_type_nodes_ht
静态非基本类型的哈希表。每个GType
就是对应TypeNode
的内存地址如果是 TypeNode
的非基本类型或索引在 static_fundamental_type_nodes
在基本类型的情况下。动态类型会发生什么 - 我不知道,如果可以请解释一下。对应的代码驻留在gtype_init函数中,负责类型系统的初始化:http://git.gnome.org/browse/glib/tree/gobject/gtype.c#n4323 .
GValue
, GParamSpec
和 GObject
是 GTypes
他们自己,所以他们被注册为类型。GValue
意味着用于通过它注册新的类型值,但是如何呢?GParameters
和 GParamSpec
似乎需要注册GObject
类型(不确定)。它究竟是如何完成的?各自的作用是什么?
最重要的是:GTypeValueTable
的角色是什么? , GTypeInfo
和 TypeData
? TypeData
被 TypeNode
引用并包含 GTypeValueTable
以及子结构 BoxedData、ClassData、IFaceData、InstanceData(为什么是 Instance,我们不是在注册类型吗?)。此外,它们似乎相互重复,因为它们都包含对 base_init/finalize 的引用,class_init/finalize 对 GTypeValueTable
的引用.
所以,GObject 爸爸,如果你正在阅读这篇文章,请解释一下自己!描述你使用的那些结构的目的。
最佳答案
除非您尝试处理一些非常低级的代码,否则您真正需要关心的仅有两个是 GValue 和 GParamType
我将从 GParamType
开始GParamType
用于向 GObject 注册属性。比如说,我有一个名为 Person 的 GObject 子类,我希望它有两个属性:Name 和 Age。在 class_init
功能我会像这样注册这些
{
GParamSpec *pspec;
. . .
pspec = g_param_spec_string ("name", "Name", "The name of the person", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_NAME, pspec);
pspec = g_param_spec_int ("age", "Age", "The age of the person", 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_AGE, spec);
. . .
}
g_object_get
或
g_object_set
在这些属性上,系统将知道如何处理它
char *name;
int age;
g_object_set (G_OBJECT (person), "name", "Steve", "age", 37, NULL);
g_object_get (G_OBJECT (person), "name", &name, "age", &age, NULL);
g_print ("%s is %d years old\n", name, age);
// And because the type system knows when a property is a string, it knows how to give
// you a copy of the string, so you need to free it once you've finished with it
g_free (name);
g_param_spec_get_name
来检测哪个属性收到了通知信号很有用。 ,但实际上最好使用更具体的通知信号,如下所示:
g_signal_connect (person, "notify::name", G_CALLBACK (name_changed_cb), NULL);
g_signal_connect (person, "notify::age", G_CALLBACK (age_changed_cb), NULL);
g_signal_connect (person, "notify", G_CALLBACK (something_changed_cb), NULL);
struct _PersonDetails {
char *name;
int age;
}
struct _PersonDetails
所以我需要为它创建一个盒装类型,以便它知道如何正确复制/释放结构,因为它在 Glib 内部传递。这就是
GValue
进来。
GValue
用于包装不同类型的值,以便可以正确复制和释放它们(如果需要),并且可以使用通用函数。
void set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
g_object_set
和
g_object_get
知道如何处理传入的参数,因为它知道属性“name”已注册为字符串类型,并且它具有复制/释放该字符串所需的功能。
struct _PersonDetails
使用 GLib 类型系统,我们将创建一个自定义的 Boxed 类型,它告诉系统如何复制和释放它。详情在这里:
Boxed Types
G_DEFINE_BOXED_TYPE (PersonDetails, person_details,
person_details_copy,
person_details_free)
. . .
static gpointer
person_details_copy (gpointer data)
{
struct _PersonDetails *details = (struct _PersonDetails *)data;
struct _PersonDetails *copy = g_new (struct _PersonDetails, 1);
// We need to copy the string
copy->name = g_strdup (details->name);
copy->age = details->age;
return (gpointer) copy;
}
static void
person_details_free (gpointer data)
{
struct _PersonDetails *details = (struct _PersonDetails *)data;
// name was allocated so it needs freed as well
g_free (details->name);
g_free (details);
}
pspec = g_param_spec_boxed ("details", "Details", "The person's details", person_details_get_type (), G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_DETAILS, pspec);
关于gtk - GValue、GTypeValueTable、GTypeInfo 和 GParamSpec 的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14840456/
XML可以应用于 WEB 开发的许多方面,常用于简化数据的存储和共享 XML 把数据从 HTML 分离 现在的HTML 文档一般都是显示动态数据,每当数据改变时将花费大量的时间来编辑 HTML
在类(class)(方案)中,我们最近学习了允许函数接受任意数量参数的语法,例如; (define len (lambda args (length args))) >(len 1 2 3
在 redis-cli 中执行 info 命令时,会列出与该服务器相关的所有信息。 “evicted_keys”的目的是什么? 最佳答案 Redis 可以配置为根据需要自动清除键。如果这样配置,red
golang 空结构体 struct{} 可以用来节省内存 ? 1
有人可以解释一下资源文件夹中的 Info.plist 是什么吗?我如何在我的应用程序中使用它?提前致谢。 最佳答案 您可以在Info.plist文件中为所有类型的设备指定不同的常规资源和应用程序配置,
我需要减小可执行文件的大小,并且经常在我的可执行文件中将某些“不必要的” uses占用一定的大小。 例如: Unit1连接到Unit2,但是两个单元的导入为“ System.SysUtils”。 然后
我是 OOP 的新手。虽然我了解多态是什么,但我无法真正使用它。我可以有不同名称的函数。为什么我应该尝试在我的应用程序中实现多态性。 最佳答案 在严格类型化的语言中,多态性对于拥有不同类型对象的列表/
Possible Duplicate: What is the difference between a delegate and events? Possible Duplicate: Differ
这个问题在这里已经有了答案: Custom index.html javadoc page? (2 个答案) 关闭 7 年前。 我使用的是eclipse。一般情况下我们可以使用javadoc.exe
你能解释一下吗ValidateAntiForgeryToken目的并向我展示有关 MVC 4 中的 ValidateAntiForgeryToken 的示例? 我找不到任何解释此属性的示例? 最佳答案
我正在学习 RxSwift 并试图了解 Observable 和 PublishSubject aka Sequence 之间的主要区别。 据我了解,Sequences/PublishesSubjec
有时有人说,在使用 Azure 表时,实际上存在第三个关键分区数据 - 表名称本身。 我在执行分段查询时注意到 TableContinuationToken 有一个 NextTableName 属性。
在Apple提供的aurioTouch项目中,听说在performRender()函数下的AudioController文件中的AudioBufferList ioData携带了mic到音频播放器的音
MSDN 文档没有详细解释它的用途。 由于它是可选的,我几乎假设它类似于某种元数据。 我现在如何看待它,我想用它来为特定用户指定缓存,例如: new CacheItem(key: "keyName",
我正在学习 browserify,我正在尝试用它做两件基本的事情: 转换(通过 shim)非 CommonJS 模块以实现易用性和依赖跟踪 捆绑项目特定的库 我找到了一个工作流程,说明如何使用 Gul
我通过按 CTRL + C 访问 eix 1.8.2 的 Break 菜单。它看起来像这样: BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
在 codeLabs 教程(Android - Kotlin - Room with a View)中,他们使用“viewModelScope.launch(Dispatchers.IO)”来调用插入
我通过按 CTRL + C 访问 eix 1.8.2 的 Break 菜单。它看起来像这样: BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
请耐心等待,因为我没有太多地使用压缩算法,所以这对你们中的一些人来说可能是显而易见的。当某些流媒体视频开始滞后时,我总是注意到这一点。当我看到这个问题时我才意识到我很好奇: Twitter image
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我是一名优秀的程序员,十分优秀!