Count bei NSMutableArray führt zum Absturz

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Count bei NSMutableArray führt zum Absturz

    Ich verstehe schon wieder was nicht und langsam macht mir das Angst ;( !

    Es geht um ein NSMutableArray, das ich über ein paar andere Klassen erreichen möchte.
    Dieses Array verwende ich in einer UITableView, die letztendlich eine Liste mit Sektionen anzeigen soll.

    Die TableView wird in der Methode viewDidLoad gefüllt und dort läuft noch alles rund.

    Erst wenn mein ViewController mit viewDidAppear an den Start geht, beginnen die Probleme, denn eine Abfrage auf [array count] führt zum Absturz.
    Dabei scheint das Array selbst zu existieren, was ich so getestet habe:

    Quellcode

    1. XmlData *xData = [[BIS_Common sharedInstance] lastXmlData];
    2. if (xData) {
    3. DLog(@"xData EXISTIERT !!!!!!");
    4. XmlListe *xListe = [xData getXmlListe];
    5. if (xListe) {
    6. DLog(@"xListe EXISTIERT !!!!!!");
    7. NSMutableArray *xArray = [xListe fastListSections];
    8. if (xArray) {
    9. DLog(@"aArray EXISTIERT !!!!!!");
    10. DLog(@"aArray contains %d items", [xArray count]);
    11. }
    12. }
    13. }
    Alles anzeigen


    In der Console bekomme ich alle Meldungen bis zum "aArray EXISTIERT !!!!!", dann bricht das Programm ab.
    Im Debugger sehe ich, dass das Array die erwarteten 26 Einträge hat, wenn ich eine Zeile davor einen Breakpoint setze.

    Das geht doch nicht mit rechten Dingen zu, oder?

    Ach ja, das Array ist ein Array of Array und soll die 26 Buchstaben als Sektionen und die Listeinträge verwalten. Im Array für die Zeilen wird eine Klasse mit einem NSString und einem int-Wert gespeichert.

    Die Ausgabe, die in viewDidAppear scheitert, funktioniert noch in viewDidLoad...! ?(
  • gritsch schrieb:

    mach doch mal sowas:
    Wenn ich deine 5 Zeilen einbaue, bricht das Programm ab, BEVOR das Array zugewiesen wird!

    Die Konsole sagt:

    Quellcode

    1. 2011-11-23 08:32:20.959 SPS Client[271:207] -[XmlViewController viewDidAppear:] [Zeile 260] ViewDidAppear
    2. 2011-11-23 08:32:20.960 SPS Client[271:207] -[XmlViewController viewDidAppear:] [Zeile 265] xData EXISTIERT !!!!!!
    3. 2011-11-23 08:32:20.960 SPS Client[271:207] -[XmlViewController viewDidAppear:] [Zeile 268] xListe EXISTIERT !!!!!!


    dann ist Schicht.



    Der Debugger zeigt, dass xArray nach der Zuweisung zwar auf irgendeine Adresse zeigt, aber scheinbar auf eine falsche.
  • ramo schrieb:

    XmlListe *xListe = [xData getXmlListe];
    NSLOG(@"xListe %@", xListe);
    Dann erhalte ich:

    Quellcode

    1. xListe


    gritsch schrieb:

    na dann hast wohl mit dem speicher gepfuscht bzw mit der speicherverwaltung!
    Das fürchte ich auch, aber wo?

    Das merkwürdige ist, dass kurz vorher noch alles OK ist.
    Im viewDidLoad passt alles bis zum Schluss.
    Dann schaue ich noch in der Klasse vorbei, die den aktuellen Controller gestartet hat und am Ende des Aufrufes ist immer noch alles OK.
    Der Start erfolgt mit

    Quellcode

    1. [self presentModalViewController: xmlController animated:YES];

    und der Aufrufer verbleib ohne dealloc im Speicher.

    Erst wenn ich bei viewDidAppear ankomme, ist der Speicher durcheinander.
    Ich weiß gar nicht, wo dazwischen noch etwas passieren kann ...? ?(
  • Ich wollte mit meinem Post eigentlich darauf hinaus, dass man bei einem Absturzt doch durchaus sinnvolle hinweise bekommt. Wenn Du die verraets, koennte man vielleicht bessere Ratschlaege geben. In zeiten von guten Debuggern braucht man doch kein printf-debugging (NSLog-Debugging...) mehr..

    Gibt es eine Speicher-Zugriffsverletzung? Wenn ja, wo? Ist der Stack noch in Ordnung? Etc. etc.
    C++
  • Gefunden! :thumbsup:

    Ich habe gerade im Debugger entdeckt, dass die anderen NSMutableArrays in xListe im Debugfenster einen anderen Typ haben.
    Bei xArray (Ich entschuldige mich für diese blöden Namen, die heißen eigentlich im Code sinnvoller und wurden nur für dieses Posting gekürzt :) steht "NSMutableArray *", bei den anderen "__NSArrayM *"

    Ich habe mir dann die Zuweisungen angesehen und festgestellt, dass ich die funktionieren Zweisungen mit

    Quellcode

    1. array = [[NSMUtableArray arrayWithObject:] retain]

    erstellt habe und bei der anderen habe ich mit

    Quellcode

    1. xListe = [NSMutableArray array]

    das retain weggelassen.

    Ich dachte, mit "Build and Analyse" würden solche Fehler entdeckt, aber dem war nicht.
    Zugegebenermaßen tue ich mich noch etwas schwer mit der Speicherverwaltung. :S

    @zerm:
    Das gilt auch für das Debuggen.... :rolleyes:

    Vielen Dank für eure Hilfe!!
  • Thallius schrieb:

    Das mit dem retain selber dran klatschen ist ganz mieser stil.


    Wer sagt das?
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)