2009-08-19 8 views
0

Ich habe, was ich denke, ist ein seltsamer Fehler, aber natürlich bin ich relativ neu in iPhone Development, so ist es möglich, dass es nicht so komisch ist.NSMutableArray Entfernen des Objekts, aber dann stürzt app

Ich habe ein Array (NSMutableArray) von Objekten, die ich verfolgen (eins wird jedes Mal hinzugefügt, wenn der Benutzer eine Schaltfläche berührt), was ich versuche zu tun ist, wenn das Array einen bestimmten Wert I erreicht Fügen Sie das neue Objekt am Anfang des Arrays hinzu und entfernen Sie dann das letzte Objekt im Array. Wenn ich meinen Code durchgehe, funktioniert alles, das Objekt wird entfernt, aber dann stürzt die App einfach ab ... der Debugger befindet sich nicht in irgendeiner Codezeile, wenn die App abstürzt und es keine Loops oder Timer in der App gibt. Ich denke an alles andere, was gerade läuft.

hier ist der Code,

if([objectArray count] > 10) 
{ 
    MyObject *objectToRemove = [[MyObject alloc] init]; 
    objectToRemove = [objectArray objectAtIndex:10]; 
    [objectArray removeObjectAtIndex:10]; 
    [objectToRemove removeFromSuperview]; 
} 

der wichtigste Punkt dieses Codes direkt vor dem Absturz ausgeführt wird, ist, dass jedes Mal wenn der Benutzer eine Taste berührt ein Objekt auf dem Bildschirm hinzugefügt und angezeigt wird, und dann, wenn die Anzahl der Objekte erreicht 10 und der Benutzer berührt die Schaltfläche erneut. Das erste Objekt, das hinzugefügt wurde, wird entfernt und das neue Objekt wird angezeigt. Wenn ich die removeObjectAtIndex-Zeile auskommentiere, funktioniert alles wie gewünscht, aber das Array wächst weiter.

Ich habe auch versucht, das Objekt zu entfernen, nachdem die UIview entfernt wurde und die App auf die gleiche Weise verhält. Wenn ich versuche, ein Objekt aus dem Array in einem anderen Index (I.E 3) zu entfernen, stürzt die App nicht ab, aber es gibt mir nicht mein erwartetes Ergebnis. Aber wie gesagt, der Code läuft gut und wenn ich die Anzahl der Arrays vor und nach der Ausführung der Zeile überprüfe, lautet der Wert 11 bzw. 10.

Jede Hilfe Sie erkannt werden, liefern würde,

BWC

Antwort

6

Ich glaube nicht das tut, was Sie denken, es tut. Möchten Sie Zeile für Zeile.

MyObject *objectToRemove = [[MyObject alloc] init]; 

Sie ein neues Objekt vom Typ „MyObject zuteilen

objectToRemove = [objectArray objectAtIndex:10]; 

Sie Ihren lokalen MyObject Zeiger überschrieben mit dem, was in objectArray bei Index 10 war der objectToRemove, die Sie ursprünglich zugewiesen. durchgesickert ist jetzt.

[objectArray removeObjectAtIndex:10]; 

jetzt haben Sie das Objekt am Index 10 entfernt, wenn Sie es aus dem Array entfernen, wird freigegeben und der Referenzzähler dekrementiert. T Dies kann (oder auch nicht) dazu führen, dass es freigegeben wird.

[objectToRemove removeFromSuperview]; 

Jetzt senden Sie eine Nachricht an das Objekt, das zuvor im ObjektArray war. Wenn das Objekt von der vorherigen Codezeile freigegeben wurde, würde ich einen Absturz erwarten.

das Leck in der Erklärung Lässt man einmal beiseite, könnten Sie in der Lage sein, dies zu tun:

 objectToRemove = [[objectArray objectAtIndex:10] retain]; 
     [objectArray removeObjectAtIndex:10]; 
     [objectToRemove removeFromSuperview]; 
     [objectToRemove release]; 

Das von dem Objekt verhindern würde, dass unter Ihnen ausgeplant heraus, wenn es das ist, warum der Absturz passiert.

Eine Möglichkeit zu bestimmen, ob mein Szenario ist, ist, NSZombies zu aktivieren, was Sie tun können, indem Sie die Umgebungsvariable NSZombieEnabled auf YES setzen.

1

Wie wäre:

MyObject *objectToRemove = [objectArray objectAtIndex:10]; 
[objectToRemove removeFromSuperview]; 
[objectArray removeObjectAtIndex:10]; 

removeFromSuperview die Zählung behalten dekrementiert einmal auf objectToRemove. (removeFromSuperview impliziert, dass es der Ansicht zuvor hinzugefügt wurde und dass es beibehalten und seine Retain-Anzahl um eins erhöht hat). removeObjectAtIndex dekrementiert es erneut. Aber in dieser Reihenfolge werden Sie es höchstwahrscheinlich nicht veröffentlichen, wenn Sie es noch benötigen. (Natürlich, das Hinzufügen zu dem Array auch beibehalten, so dass die Reihenfolge möglicherweise nicht so wichtig sein).

Verwandte Themen