2010-05-17 17 views
5

J'utilise libnotify pour afficher les notifications de bureau dans mon application; notify_notification_new() renvoie un NotifyNotification*, qui doit être transmis en tant que premier paramètre aux autres appels de fonction de la bibliothèque de notification.Un g_object_new doit-il correspondre à g_object_unref?

Il n'y a pas notify_notification_free() qui libère le pointeur qu'il renvoie. Je regardais la source de notify_notification_new() et à l'intérieur il fait un g_object_new(), obtient un GObject * et retourne en tant que NotfiyNotification*, alors quand ma demande fait le nettoyage, dois-je appeler un g_object_unref() sur le pointeur retourné par notify_notification_new()?

Répondre

10

Oui, sauf si la référence est "flottante". Les sous-classes GInitiallyUnowned utilisent des références flottantes; l'utilisation la plus courante est les widgets GTK.

Lorsque vous créez un widget GTK à l'aide d'une fonction gtk_whatever_new(), une référence est marquée comme flottante. Lorsque vous ajoutez le widget à un conteneur, le conteneur doit également contenir une référence au widget. Mais au lieu d'appeler g_object_ref() sur le widget et d'augmenter le nombre de références à 2, il "coule" la référence flottante de l'objet et le transforme en une référence normale. On pourrait dire que le conteneur "possède" le widget.

Ensuite, lorsque vous détruisez le conteneur, il appelle g_object_unref() sur le widget, et le nombre de références devient zéro, et le widget est détruit. De cette façon, vous n'êtes plus responsable de la détruire vous-même. Donc, avec GObject s, qui normalement ne vont pas dans des conteneurs, il n'y a pas de transfert de propriété. Vous devez les désorienter vous-même lorsque vous en avez fini avec eux.

+0

C'était perspicace; Merci pour l'info. – legends2k

+0

@ptomato Quels en-têtes supplémentaires dois-je appeler 'g_object_unref()'? J'inclus actuellement seulement 'libnotify/notify.h'. –

+0

'#include ' – ptomato