2010-05-17 14 views
5

Ich verwende libnotify, um Desktop-Benachrichtigungen in meinem application anzuzeigen; notify_notification_new() gibt eine NotifyNotification* zurück, die als erster Parameter an weitere Funktionsaufrufe der Benachrichtigungsbibliothek übergeben werden sollte.Sollte ein g_object_new eine passende g_object_unref haben?

Es gibt keine notify_notification_free(), die den zurückgegebenen Zeiger freigibt. Ich sah die Quelle notify_notification_new() und intern ist es eine g_object_new(), bekommt ein GObject * und gibt er als NotfiyNotification*, so dass, wenn meine Anwendung die sauber macht, soll ich von notify_notification_new() einen g_object_unref() auf dem Zeiger zurückrufen?

Antwort

10

Ja, es sei denn, die Referenz ist "schwebend". Unterklassen von GInitiallyUnowned verwenden Floating-Referenzen; Am häufigsten werden GTK-Widgets verwendet.

Wenn Sie ein GTK-Widget mit einer gtk_whatever_new()-Funktion erstellen, verfügt es über eine Referenz, die als Floating gekennzeichnet ist. Wenn Sie das Widget einem Container hinzufügen, muss der Container auch einen Verweis auf das Widget enthalten. Aber anstatt g_object_ref() auf dem Widget aufzurufen und die Referenzzahl auf 2 zu erhöhen, "sinkt" es die Floating-Referenz des Objekts und verwandelt es in eine normale Referenz. Man könnte sagen, dass der Container jetzt das Widget "besitzt".

Wenn Sie den Container dann zerstören, ruft er g_object_unref() für das Widget auf, und der Referenzzähler wird null und das Widget wird zerstört. So bist du nicht mehr dafür verantwortlich, es selbst zu zerstören.

So mit normalen GObject s, die normalerweise nicht in Containern gehen, gibt es keine Übertragung des Eigentums. Sie müssen sie selbst zurücknehmen, wenn Sie mit ihnen fertig sind.

+0

Das war aufschlussreich; Danke für die Information. – legends2k

+0

@ptomato Welche zusätzlichen Header muss ich 'g_object_unref()' aufrufen? Ich bin derzeit nur "libnotify/notify.h". –

+0

'#include ' – ptomato

Verwandte Themen