Autor Beitrag
Nico80
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

WIN XP
DELPHI 2006
BeitragVerfasst: Do 07.09.06 15:45 
ich habe eine Frage zum Thema Interface...

ich habe folgende Methode (die bis jetzt nichts macht):

ausblenden Delphi-Quelltext
1:
2:
3:
procedure TSubject.RegisterObserver(Observer: IObserver);
begin
end;


so rufe ich diese Methode auf:

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

WIN XP
DELPHI 2006
BeitragVerfasst: Do 07.09.06 16:43 
ok habe ich gesehen. und wie kann ich das verhindern? oder was mache ich falsch???
Nico80 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

WIN XP
DELPHI 2006
BeitragVerfasst: Do 07.09.06 16:53 
ok mit _addRef

hab die Antwort selbst gefunden!!!
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Do 07.09.06 18:33 
du kannst alternativ dazu (und bevorzugt!) den Parameter als konstanten Wert übergeben:

ausblenden 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!

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean