![]() |
Memory Leaks im Webservice (Unter iOS & Android)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen
Mein WebService-Aufruf tut mir immer grosse Memory Leaks machen, wodurch meine App nicht länger als ein paar Stunden im Background bleiben kann. (Was wichtig ist) Schon nur das Login und Logout lassen Leaks entstehen lassen. Das WSDL habe ich in Delphi mit dem Wizard importiert. In den xCode-Instruments habe ich dann einen Haufen an "malloc"-Einträgen, aber ich weiss nicht was ich mit denen tun soll. Ich weiss nicht, was ich nicht gefreet habe oder sonswie am Leben habe laufen lassen, hat jemand eine Idee? Danke.
Delphi-Quellcode:
procedure TDataModule.SOAPLogin();
var loginRes:loginResponse; WSLogin:login; begin WSLogin := login.Create; WSLogin.user := user; WSLogin.password := passwort; WSLogin.domain := ''; sess := sessionHeader.Create; try try WSInterface := GetWSInterface(true, ''); loginRes := WSInterface.login(WSLogin); sess.sessionId := loginRes.sessionId; (WSInterface as ISOAPHeaders).Send(sess); except on E:Exception do begin TfgToast.Show('SOAPLogin ist fehlgeschlagen.') end; end; finally WSLogin.Free; loginRes.Free; end; end; procedure TDataModule.SOAPLogout(); var WSLogout:logout; logoutRes:logoutResponse; begin WSLogout := logout.Create; try if sess.sessionId <> '' then begin try WSLogout.sessionId := sess.sessionId; logoutRes := WSInterface.logout(WSLogout); except on E:Exception do begin TfgToast.Show('SOAPLogout ist fehlgeschlagen.') end; end; end; finally WSLogout.Free; if Assigned(sess) then sess.Free; if Assigned(logoutRes) then logoutRes.Free; WSInterface := nil; end; end; |
AW: Memory Leaks im Webservice (Unter iOS & Android)
Was ist mit sess ?
|
AW: Memory Leaks im Webservice (Unter iOS & Android)
In der Logout-Routine:
Zitat:
|
AW: Memory Leaks im Webservice (Unter iOS & Android)
Genau, sess (sessionHeader) und WSInterface sind als Properties vom Datamodule definiert, damit von beiden Funktionen aus darauf zugegriffen werden kann.
Im Login wird sess initialisiert, und im Logout wieder freigegeben. |
AW: Memory Leaks im Webservice (Unter iOS & Android)
Unter ARM (iOS und Android) sollte ".DisposeOf" statt ".Free" verwendet werden.
|
AW: Memory Leaks im Webservice (Unter iOS & Android)
Zitat:
|
AW: Memory Leaks im Webservice (Unter iOS & Android)
Zitat:
|
AW: Memory Leaks im Webservice (Unter iOS & Android)
Zitat:
1) Neues Projekt 2) WSDL-Datei importieren und WSDL-Datei in Bereitstellung tun 3) openSSL-Dateien in Bereitstellung reintun 4) DataModule mit SOAPLogin und SOAPLogout 5) ButtonClick
Delphi-Quellcode:
^ Gibt mir immer noch 400-500 Leaks pro Click (In xCode Instruments!! Ich weiss nicht, ob das bei "einem Leak mehr anzeigt")
procedure TForm2.Button1Click(Sender: TObject);
var cn: TDataModule; begin cn := TDataModule.Create(nil); try cn.SOAPLogin; cn.SOAPLogout; ShowMessage('done'); finally cn.Free; end; end; Was kann denn falsch sein, die importierte WSDL-Datei, die Art wie ich den Webservice aufrufe, oder..? |
AW: Memory Leaks im Webservice (Unter iOS & Android)
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe in den Bildern eine Aufzeichnung von n paar Memory Leaks in xCode.
Das wäre doch eine zirkuläre Referenz, nicht? Kann ich da jetzt etwas machen, wenn das in Indy's Komponenten (TIdSSLContext und TIdSSLSocket wie auf dem Bild z.B.) ist, ausser einfach die Dateien zu kopieren und zu verändern? Oder bin ich komplett auf dem falschen Weg? |
AW: Memory Leaks im Webservice (Unter iOS & Android)
Delphi-Quellcode:
Webservice:
function TDataModule.getWeatherCities:string;
var WSInterface: GlobalWeatherSoap; begin WSInterface := GetGlobalWeatherSOAP; result := WSInterface.GetCitiesByCountry('Switzerland'); WSInterface := nil; end; procedure TForm2.Button1Click(Sender: TObject); var cn: TDataModule; cities:string; begin cn := TDataModule.Create(nil); try cities := cn.GetWeatherCities; Memo1.Lines.Add(cities); Button1.Text := BUtton1.Text + 'done'; finally cn.DisposeOf; end; end; ![]() Hiermit gibt es keine Leaks. Kann ich also sicher davon ausgehen, dass der Leak irgendwo in den SSL-Units passiert? Schliesslich passiert das erst wenn ich einen SessionHeader mache und vor jedem Call schicke. Bin im Moment ratlos, was ich denn tun könnte, ausser zu versuchen die SSL-Units zu "fixen"? (Was für mich wohl nicht in 'nem Tag gemacht wäre) Grüsse |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz