每一个 GType 都有两个结构体 :instance struct 和 class struct ,二者的生命周期、实例个数 和 司职都有区别。
实例个数:
class struct 是所有具备相同 GType 的 GObject 所共享的,只有一个实例,而 instance struct 是每一个 GObject 独享的,有很多实例。
生命周期:
每个 GObject 的销毁都伴随这一个 instance struct 的销毁,当且仅当所有具备相同 GType 的 GObject 都被销毁时,相应的 class struct 才会销毁。
司职:
前面说到了实例个数和生命周期,结合二者便可以揣测出二者责任的划分:
- 通常会把和当前 GType 相关的 metadata 存入 class struct ,而把和某个实例强关联的数据放到 instance struct 中,比如 property 的赋初值;
- parent class struct 放到 class struct 中,因为所有 GType 的 class struct 同样是独一份的;
- 成员函数放到 class struct 中,因为对于一个 类来说,成员函数应当是一致的;
- 成员变量(property)放到 instance struct 中,因为每个 element 实例都应该有自己的成员变量值;
- 其他内容可以结合实力情况自行断定应该放在哪个struct,这里没有固定模式,放在哪还要结合生命周期和实例个数来判定。比如一个 GType 如果被设计成单例的,那么instance struct中可以什么都不放。