Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Kein Zugriff auf NSMutableArray

Kein Zugriff auf NSMutableArray

4D616313.02.1116:58
Hi,

ich weiß nicht so genau ob es das richtige Forum ist, aber ich beschäftige mich nu seit ca 1 Monat mit der Macprogrammierung. Ich hab mir ein kleines Programm geschrieben, was ein paar Daten verwalten soll. Um die Daten auf die Festplatte zu schreiben und bei Programmstart wieder auszulesen hab ich mir eine eigene Klasse geschrieben (aus Kompatiblitätsgründen mit C-Code, und nicht über CoreData). Das funktioniert alles auch prima, der Prototyp von der Methode sieht so aus:
-(NSMutableArray *)loadData
und bei
id array = [[klassenInstanz loadData] copy];
wird dem auch die richtige Kopie von dem Array zugewiesen (im Debugger kann ich mir jedes Element anschauen), aber sobald ich über den Programmcode auf das Array zugreifen will passiert...neja, es passiert nichts oO
id object = [array objectAtIndex:i];
Wenn ich mit dem Debugger durch den Code gehe komm ich bis zu so einer stelle, denn ab dann wird jeglicher weiterer Programmcode einfach ignoriert. Man kann es sich wie ein goto von da zum Ende der Methode vorstellen. Es findet zudem auch keine Wertzuweisung statt. Eben wie ein goto zum Ende der Methode.
Wo ist hier mein Denkfehler? Der Compiler spuckt keine Warnungen aus, und die Garbagecollection ist deaktiviert.

mfg
0

Kommentare

iCode
iCode14.02.1109:21
Je nach Ownershiip und Design sollte das wohl in etwa so aussehen:
id array = [[NSArray alloc] initWithArray:[klassenInstanz loadData]];

Üblicher wäre es (unter Vermeidung eines Singleton) aber in etwa so
id array = [[NSArray alloc] initWithContentsOfFile:MYPATH];

P.S. Benenne "array" mal ordnungsgemäß.
0
Marcel Bresink14.02.1109:37
Wenn ich mit dem Debugger durch den Code gehe komm ich bis zu so einer stelle, denn ab dann wird jeglicher weiterer Programmcode einfach ignoriert.

Das ist ein Bug in der grafischen Oberfläche des Debuggers, der in Xcode 3 öfter vorkommt. Dein Programm läuft wahrscheinlich einwandfrei.

Gibt es denn ein konkretes Problem im Programm? Das geht aus dem Beitrag überhaupt nicht hervor.
0
4D616314.02.1112:40
@iCode ich werd es ausprobieren, nur witzigerweise funktioniert es grad so, wie ich es oben in meinem Thread beschrieben hab. Zwar nicht zuverlässig aber meist funktioniert es.

@Marcel Bresink in der tat gibt es Probleme, und es ist scheinbar kein Bug im Debugger, weil er das verhalten richtig beschreibt. Wenn ich das Programm ohne Debugger starte läd er entweder das File nicht (neja, er macht das auch wenn der Debugger aktiv ist, daher weiß ich ja auch, das er das File in Wahrheit ordnungsgemäß läd, sondern das es an dem Array hängt), oder es gibt eine EXC_BAD_ACCESS. Durch den Debugger weiß ich aber, das der EXC_BAD_ACCESS eigentlich nicht sein kann, da das Array zuverlässig geladen wird, und auch immer richtige Werte drinne stehen. Auch irgendeine Referenz zu einem nicht zugewiesenen Speicherbereich kann es nicht sein, um diese EXC_BAD_ACCESSes vorzubeugen leg ich mittlerweile bei jeder Zuweisung von dem Array eine Kopie an. Trotzdem gibt es eben jene.

Was ich vergessen hab zu erwähnen, MEIST funktioniert es, um Zahlen zu nennen: 5 von 6 Programmstarts funktionieren prima, beim 6. passiert irgendetwas, was ich nicht nachvollziehen kann.
0
4D616314.02.1112:49
@iCode ich werd es ausprobieren, nur witzigerweise funktioniert es grad so, wie ich es oben in meinem Thread beschrieben hab. Zwar nicht zuverlässig aber meist funktioniert es.

@Marcel Bresink in der tat gibt es Probleme, und es ist scheinbar kein Bug im Debugger, weil er das verhalten richtig beschreibt. Wenn ich das Programm ohne Debugger starte läd er entweder das File nicht, oder es gibt eine EXC_BAD_ACCESS. Durch den Debugger weiß ich aber, das der EXC_BAD_ACCESS eigentlich nicht sein kann, da das Array zuverlässig initialisiert und gefüllt wird. Die EXC_BAD_ACCESS gibt es nur bei Operationen mit diesem Array.

Was ich vergessen hab zu erwähnen, MEIST funktioniert es, um Zahlen zu nennen: 5 von 6 Programmstarts funktionieren prima, beim 6. passiert irgendetwas, was ich nicht nachvollziehen kann.
0
Marcel Bresink14.02.1120:04
oder es gibt eine EXC_BAD_ACCESS

Nun gut, das ist ja wieder was ganz anderes. Es könnte zum Beispiel sein, dass Du einen retain/release-Fehler gemacht hast, und "hinter Deinem Rücken" Teile des Arrays über einen Autorelease-Pool freigegeben wurden. Das kann man im Debugger nicht direkt sehen, denn das findet ja außerhalb Deines eigenen Codes statt. Je nach dem, welche Bytes zufällig im freien Speicher stehen und dann fälschlicherweise als Pointer verwendet werden, stürzt das Programm dann völlig unregelmäßig ab.

Da müsste man jetzt mehr Teile des Programms sehen.
0
Marcel Bresink14.02.1120:09
Dieser Thread ist wieder mal defekt. Statt eine Antwort hinzuzufügen, wird der vorletzte Beitrag dupliziert.
0
uhu
uhu14.02.1121:01
Ich stimme auch Marcel Bresinks Vermutung bei, dass es sich dabei um ein Autorelease Problem handelt. Aber ohne den ganzen (wirklich relevanten Code gesehen zu haben wird es schwierig konkret weiterhelfen zu können.
0
ExMacRabbitPro14.02.1121:57
4D6163

Schau Dir mal das NSCoding Protokoll und das drumherum an! Das ist die erste Wahl, wenn du ohne CoreData Objektgraphen speichern willst.
Dazu musst Du dann auch nicht deine eigene Load/Store Logik entwickeln.
0
ExMacRabbitPro14.02.1121:57
4D6163

Schau Dir mal das NSCoding Protokoll an!
0
4D616315.02.1100:19
Ok, ich werd mal den Weg von Datei bis z.B. zur ListBox beschrieben.

Also bei Programmstart sollen die Daten geladen werden
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    arraySaver *load = [[arraySaver alloc] init];    
    self.items = [load loadArray];         
    [load release];
    [view noteNumberOfRowsChanged]; 
}
items ist das MutbableArray welches die Probleme bereitet!

Die property von items:
@property (retain) NSMutableArray *items;
Ich habs auch schon mit copy probiert, es kommt aber im Endeffekt das selbe bei raus. Sinnigerweise.

In der loadArray Methode lade ich dann die Daten aus der Datei und speichere sie in das Array. Z.B. der String für die Listview wird wie folgt erstellt:
        while ((int)(c[0] = (char *)fgetc(fileFile)) == 0x02) {
            newItem = [[ListViewItem alloc] init];  //Das sind die Objecte, die das Array verwalten soll. In diesen Objecten werden die Daten gespeichert, die aus der Datei gelesen werden. Diese Klasse enthält nur Propertys, z.B. "@property (retain) NSString *listItem" und ein paar inits.
            //listItem
            if ((int)(c[0] = (char *)fgetc(fileFile)) == 0x03) {
                newString = [[NSMutableString alloc] init];
                while ((int)(c[0] = (char *)fgetc(fileFile)) != 0x07) {
                    [newString appendString: [[NSString alloc] initWithUTF8String:(char *)c]];
                }                
                [newItem setListItem:newString];            
            }
            [array addObject:newItem]; //Dieses Array ist das MutableArray was diese Methode zurück gibt, und zu items wird.
            c[0] = (char *)fgetc(fileFile);
        }


Wie oben zu sehen ist, kommt dann die Aktualisierung der Listview. Hier die Methode dazu.
-(id)tableView:(NSTableView *)tableView 
objectValueForTableColumn:(NSTableColumn *)tableColumn
           row:(NSInteger)row{
    return [[items objectAtIndex:row] listItem];
}

Und hier kann es schon zu ersten Fehlern kommen. Allerdings funktioniert das oft. Weitere Fehler können passieren, wenn ich z.B. wie hier
[self.items addObject:[[ListViewItem alloc] init]];
zum Array im Nachhinein ein weiteres Object hinzufügen will.


So, ich hoffe das man daraus schlau wird

edit: Hmm, die Formatierungen mag er wohl nicht übernehmen
0
4D616315.02.1100:20
Ok, ich werd mal den Weg von Datei bis z.B. zur ListBox beschrieben.

Also bei Programmstart sollen die Daten geladen werden
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    arraySaver *load = [[arraySaver alloc] init];    
    self.items = [load loadArray];         
    [load release];
    [view noteNumberOfRowsChanged]; 
}
items ist das MutbableArray welches die Probleme bereitet!

Die property von items:
@property (retain) NSMutableArray *items;
Ich habs auch schon mit copy probiert, es kommt aber im Endeffekt das selbe bei raus. Sinnigerweise.

In der loadArray Methode lade ich dann die Daten aus der Datei und speichere sie in das Array. Z.B. der String für die Listview wird wie folgt erstellt:
        while ((int)(c[0] = (char *)fgetc(fileFile)) == 0x02) {
            newItem = [[ListViewItem alloc] init];  //Das sind die Objecte, die das Array verwalten soll. In diesen Objecten werden die Daten gespeichert, die aus der Datei gelesen werden. Diese Klasse enthält nur Propertys, z.B. "@property (retain) NSString *listItem" und ein paar inits.
            //listItem
            if ((int)(c[0] = (char *)fgetc(fileFile)) == 0x03) {
                newString = [[NSMutableString alloc] init];
                while ((int)(c[0] = (char *)fgetc(fileFile)) != 0x07) {
                    [newString appendString: [[NSString alloc] initWithUTF8String:(char *)c]];
                }                
                [newItem setListItem:newString];            
            }
            [array addObject:newItem]; //Dieses Array ist das MutableArray was diese Methode zurück gibt, und zu items wird.
            c[0] = (char *)fgetc(fileFile);
        }


Wie oben zu sehen ist, kommt dann die Aktualisierung der Listview. Hier die Methode dazu.
-(id)tableView:(NSTableView *)tableView 
objectValueForTableColumn:(NSTableColumn *)tableColumn
           row:(NSInteger)row{
    return [[items objectAtIndex:row] listItem];
}

Und hier kann es schon zu ersten Fehlern kommen. Allerdings funktioniert das oft. Weitere Fehler können passieren, wenn ich z.B. wie hier
[self.items addObject:[[ListViewItem alloc] init]];
zum Array im Nachhinein ein weiteres Object hinzufügen will.


So, ich hoffe das man daraus schlau wird
0
ExMacRabbitPro15.02.1101:14
was gibt denn loadArray zurück und wie wird das was zurück gegeben wird erzeugt?
0
ExMacRabbitPro15.02.1101:16
Jo - dieser Thread ist wirklich kaputt. Kanst DU evtl. einen neuen Thread zu dem Problem anfangen?
0
4D616315.02.1110:39
Ganz einfach
return array
wie es erzeugt wird, steht ja oben (3. Codeblock)

Hmm, die Doppelposts gehen mir irgendwie auf den keks -.-
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.