觀察g_type_register_static()的原型(prototype)可以發現,本函數涉入的主要參數為
const GTypeInfo *info。GTypeInfo的宣告如下:
struct _GTypeInfo
{
/* interface types, classed types, instantiated types */
guint16 class_size;
GBaseInitFunc base_init;
GBaseFinalizeFunc base_finalize;
/* interface types, classed types, instantiated types */
GClassInitFunc class_init;
GClassFinalizeFunc class_finalize;
gconstpointer class_data;
/* instantiated types */
guint16 instance_size;
guint16 n_preallocs;
GInstanceInitFunc instance_init;
/* value handling */
const GTypeValueTable *value_table;
};
GTypeInfo資料結構涉及了多個callback functions,可謂環環相扣。總的來說,在型別註冊至GObject system後,系統將透過這些callback functions來管理類別及物件的生命週期。在GObject system架構下,物件自產生至銷毀其流程大致可分為幾個步驟:![]() |
| Figure#1 Life cycle of a object |
GBaseFinalizeFunc、GClassFinalizeFunc則分別與GBaseInitFunc、GClassInitFunc對應,在類別創建各階段若有動態配置資源者,必須於相應的解構(destruction)周期中釋放該資源。
![]() |
| Figure#2 Callback functions involved in the life cycle of a object |
為了驗證,我們可以利用上一篇宣告的Shape類別加以驗證。
#include <glib.h>
#include "shape.h"
int main(int argc, char** argv)
{
Shape* shape1;
Shape* shape2;
g_type_init();
shape1 = g_object_new(SHAPE_TYPE, NULL);
g_print("shape1(0x%08x) is created.\n", (guint)shape1);
g_object_unref(shape1);
shape2 = g_object_new(SHAPE_TYPE, NULL);
g_print("shape2(0x%08x) is created.\n", (guint)shape2);
g_object_unref(shape2);
return 0;
}
編譯後,執行的結果:
至於GInstanceInitFunc()則可視為物件的預設建構子(default constructor),當系統分配到屬於該物件的記憶體區塊時此函式將被呼叫,使該物件有機會被指派預設值。若該類別有提供額外建構子(constructor),且於g_object_new()呼叫時有提供相關的參數值,則建構子將於GInstanceInitFunc()完成後執行。官方文件上對此機制的說明如下:
Finally, at one point or another,官方文件上的文字描述實在令人有點霧裡看花的感覺,但是實際上的概念並不複雜,之後將有完整範例展示。g_object_constructoris invoked by the last constructor in the chain. This function allocates the object's instance' buffer throughg_type_create_instancewhich means that the instance_init function is invoked at this point if one was registered. After instance_init returns, the object is fully initialized and should be ready to answer any user-request. Wheng_type_create_instancereturns,g_object_constructorsets the construction properties (i.e. the properties which were given tog_object_new) and returns to the user's constructor which is then allowed to do useful instance initialization...



No comments:
Post a Comment