Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Interface übergeben
Nico80 - Do 07.09.06 15:45
Titel: Interface übergeben
ich habe eine Frage zum Thema Interface...
ich habe folgende Methode (die bis jetzt nichts macht):
Delphi-Quelltext
1: 2: 3:
| procedure TSubject.RegisterObserver(Observer: IObserver); begin end; |
so rufe ich diese Methode auf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TObserver =class(TInterfacedObject, IObserver) ... end;
procedure TObserver.machwas(); var FSubject: TSubject; begin ... FSubject.RegisterObserver(self); ... |
Nachdem ich die Methode RegisterObserver(self) aufgerufen habe, kann ich auf das Objekt(also auf das sich self bezieht) nicht mehr zugreifen.
Wenn ich dagegen die Methode so implmentier funktionierts:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TObserver.machwas(); var FSubject: TSubject; o: IObserver; begin ... o := self; FSubject.RegisterObserver(o); ... |
IObserver ist ein Interface.
Was ändert sich durch die Zuweisung?
Bitte um Hilfe, Danke!!!!!!
iKilledKenny - Do 07.09.06 16:11
der reference count wird eins runtergezählt, danach gibts keine reference mehr auf das interface und damit räumt sich dein objekt weg.
überschreibe in deinem TObserver mal den destructor und setze dort einen breakpoint, dann siehst dus.
grüße
alex
Nico80 - Do 07.09.06 16:43
ok habe ich gesehen. und wie kann ich das verhindern? oder was mache ich falsch???
Nico80 - Do 07.09.06 16:53
ok mit _addRef
hab die Antwort selbst gefunden!!!
rochus - Do 07.09.06 18:33
du kannst alternativ dazu (und bevorzugt!) den Parameter als konstanten Wert übergeben:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TSubject.RegisterObserver(const Observer: IObserver); begin end; |
Damit sparst du dir die _AddRef-Aufrufe, die sind nämlich fehleranfällig, sprich, man vergisst sie sehr gerne!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!