Frage

Ich bräuchte einen Expertenrat, wie ich dieses Problem lösen kann.Ich führe gerade einige grobe Tests für eine neue App für das iPad durch.

Ich erstelle ein NSMutableArray (ballPath) im viewDidLoad meines View-Controllers (es ist in meiner .h-Datei deklariert), indem ich eine in einer anderen App erstellte Plist-Datei lade.

ballPath = [[NSMutableArray alloc] initWithCapacity:1000];

NSString *path=[[NSBundle mainBundle] pathForResource:@"level_1" ofType:@"plist"];

ballPath = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

Dieses Array enthält nun eine Reihe von CGPoints (von der anderen App als NSValues ​​gespeichert und archiviert).

enter image description here

Dann zeichne ich den Pfad (immer noch in meinem viewDidLoad), was gut funktioniert, also sollte der Pfad gut funktionieren.

Wenn ich später das Array als Reaktion auf Beschleunigungsänderungen lesen möchte, erhalte ich ein EXC_BAD_ACCESS.Wenn ich mein Array debugge und ansehe, sieht es so aus:

enter image description here

Ich teste und ersetze das geladene Array durch dieses (auch in viewDidLoad):

    ballPath = [[NSMutableArray alloc] initWithObjects:
            [NSValue valueWithCGPoint:CGPointMake(100.0, 100.0)],
            [NSValue valueWithCGPoint:CGPointMake(100.0, 200.0)],
            [NSValue valueWithCGPoint:CGPointMake(100.0, 300.0)],
            [NSValue valueWithCGPoint:CGPointMake(100.0, 400.0)],
            [NSValue valueWithCGPoint:CGPointMake(125.0, 450.0)],
            [NSValue valueWithCGPoint:CGPointMake(150.0, 500.0)],
            [NSValue valueWithCGPoint:CGPointMake(300.0, 600.0)],
            [NSValue valueWithCGPoint:CGPointMake(350.0, 550.0)],nil];

Dann klappt es prima!

enter image description here

Was fehlt mir hier????

Ich verwende Xcode 4.0.2 und mein Ziel ist iOS 4.3.

War es hilfreich?

Lösung

Zu diesem Zeitpunkt wird die Zuordnung des Arrays aufgehoben, sodass an der Stelle, an der sich das Array zuvor befand, zufälliger Speicher vorhanden ist.

unarchiveObjectWithFile: Gibt ein automatisch freigegebenes Objekt zurück. Wenn Sie das Array beibehalten möchten, müssen Sie es beibehalten (oder es zu einer beibehaltenen Eigenschaft machen).Das alloc-init zwei Zeilen zuvor ist völlig überflüssig (und führt wahrscheinlich zu Speicherverlusten), da Sie mit dem Array, das Sie dort erstellen, nie etwas tun ersetzt durch das Array, das Sie aus dem Bundle laden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top