![]() |
Android: Grenzen objektorientierter Programmierung?
Liste der Anhänge anzeigen (Anzahl: 1)
Nachfolgend ein Stück simplen Code das in Win32 problemlos geht aber in Android zu einem Fehler führt.
Hier das Vorgehen: Ich bilde eine einfache Klasse mit einer Variable vom Typ String: type TMyString = class (TObject) Text: String; end; Ich fülle eine TList mit einer Anzahl Instanzen: List.Clear; for i:=0 to 5 do begin MyString := TMyString.Create; MyString.Text := IntToStr (i); List.Add(MyString); end; Dann fülle ich die Werte aus der Liste in eine Listbox: var i: Integer; s: string; begin ListBox1.Clear; for i:=0 to List.Count-1 do begin {in Android wird das nicht gelesen und führt zu einem Fehler:} s := TMyString(List.Items[i]).Text; ListBox1.Items.Add(s); end; end; Kann mir jemand erklären warum geht dieser simpler Code in Android nicht? Der ganze Code ist beigefügt. |
AW: Android: Grenzen objektorientierter Programmierung?
Schade, dass der Fehler so geheim zu sein scheint, dass Du ihn hier nicht darlegen darfst.
|
AW: Android: Grenzen objektorientierter Programmierung?
Pardon, natürlich:
Der Fehler im Android Tablet ist ein "Access violation at address ...." Fehler. Wenn der Code ab der Zeile s := TMyString(List.Items[i]).Text; schrittweise verfolgt wird, - dann ist die Anzahl der Einträge (List.Count) korrekt - im Inspektor wird der Wert für den String s angegeben : <error reading addres 0x0: No error> - wenn der Code weiterverfolgt wird, dann wird in der nächsten Schleife ein Debugger Exception Notifocation Fenster geöffnet mit der Meldung "Project Project1.apk raised an exception class Segmenatation fault (11)." mit den Knöpfen "Break", "Continue", "Help". Die Help Taste ist dieses Mail :-) |
AW: Android: Grenzen objektorientierter Programmierung?
Wo hast du die Liste instanziert?
Edit: sry code is ja da, schaus mir gleich an ^^ |
AW: Android: Grenzen objektorientierter Programmierung?
Auf Android greift ARC. Und da eine TList nicht typisiert ist und nur Pointer speichert, sorgt sie nicht dafür, dass deine TMyString Objekte am Leben bleiben. D.h. beim Verlassen der Methode bzw beim erneuten Zuweisen auf die MyString Variable, wo du die TList befüllst, sind sie schon wieder freigegeben worden. Demnäch stehen in der Liste bloß noch Pointer auf nicht mehr gültigen Speicher.
Um das zu lösen, würde ich für beide Plattformen vorschlagen, eine TList<TMyString> (oder auch direkt TList<string> oder TStringList) zu benutzen. Hier auch drauf achten, dass du auf Windows keine Memoryleaks verursachst und deine TMyString Instanzen wieder richtig frei gibst, wenn die liste freigegeben wird (würde gehen, wenn du TObjectList<TMyString> benutzt) Die findest du in der Unit System.Generics.Collections. |
AW: Android: Grenzen objektorientierter Programmierung?
Herzlichen Dank für die Antwort. Das macht Sinn. Ich werde es so umsetzen.
|
AW: Android: Grenzen objektorientierter Programmierung?
Eine Verständnisfrage: ARC = Automatic Reference Counting. Bedeutet das in der Konsequenz, das ich mir um die Freigabe von Objekten keinen Kopf mehr machen muss?
Und wenn das so ist, warum ist das dann nur bei Android so? |
AW: Android: Grenzen objektorientierter Programmierung?
Weil dort der neue Nextgen-Compiler benutzt wird. Der alte kann das nicht.
|
AW: Android: Grenzen objektorientierter Programmierung?
Also ist die Konsequenz, das Quellcode derzeit nicht zwingend kompatibel ist (wenn man old-style mit Pointern arbeitet).
Ferner deutet 'NextGen' darauf hin, dass das nur ein vorübergehender Zustand ist, da man bei 'next generation' davon ausgehen kann, das ein derartiger Compiler bzw. eine Spracherweiterung/veränderung auch für Windows umgesetzt wird, oder will man bei Emba etwa zweigleisig fahren? |
AW: Android: Grenzen objektorientierter Programmierung?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 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-2025 by Thomas Breitkreuz