Die richtige Art und Weise zu erklären, alloc, load, und dealloc ein NSMutableArray

Ich erkläre mein array in mein *.h-Datei:

@interface aViewController: UIViewController 
{ 
NSMutableArray *anArray; //Sie brauchen, um später ändert sich das oft. 
} 
@Ende 

Ich alloc Speicher für mein es *.m-Datei:

-(void) viewDidLoad 
{ 
anArray = [[NSMutableArray alloc] init]; 
} 

Ich auf eine test-Taste zum laden meiner array (schließlich müssen die Last VERSCHIEDENE Werte
bei jedem Klick):

 anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; 

Und ich frei es hier:

-(void) dealloc 
{ 
[anArray release]; 
[super dealloc]; 
} 

Nicht, dass alle sehen ok?

Weil es abstürzt, wenn ich später dann diesen code ausführen:

 NSLog(@"%d", [anArray count]); 

Nicht sicher, warum ein einfaches "NSLog() und count" Abstürzen würde, alles.


Dirk,

Lassen Sie es mich so sagen: ich habe eine RIESIGE Missverständnis von Pointern, arrays, strings und Speicher.

Habe ich alles gelesen, was ich finden kann... aber (noch) zu finden, eine einfache, klare, leicht verständliche Beschreibung.

Können Sie vorschlagen? (Hoffentlich weniger als 10 Seiten zu Lesen.)
Gibt es eine Referenz, erklärt NUR diesem Thema... und aus Sicht der "Sie haben 12 Jahre Programmiererfahrung... aber KEINER, der jemals behandelt reservieren von Speicher oder Zeiger".)

Also die variable-name ist NICHT das Weise ich auf das Objekt verweisen?
Dann warum haben es?

Ich bin verwendet, um viele andere Sprachen, die genau dies tun:

myString = "dies" 
myString = "das" 

myInt = 5 
myInt = 15 

(Was könnte einfacher sein.)


Sieht für mich wie das wäre der einfachste Weg, dies zu tun.
(Und es scheint zu funktionieren. Aber ist es wirklich richtig?)

Nicht alloc Speicher für meine NSMutableArray zunächst. 
Keine re-alloc Speicher wiederholt. (Wenn ich die array-Werte.) 
Nicht loslassen, immer wieder. (Bevor ich die array-Werte.) 
Nicht loslassen, wenn ich das Programm beenden. 

Aber: 
Bitte immer daran denken, BEHALTEN, wenn ich zunächst zuordnen 
(und immer wieder neu zuordnen) neue Werte zu meinem anArray variable. 

Sind Sie nicht geladen, das array mit
anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
Stattdessen ersetzen Sie es mit einer neuen Instanz, und noch schlimmer: mit einer Instanz, deren
Referenz ist eigentlich im Besitz von einigen Person, die Sie nicht kontrollieren

Wow. So konnte ich 20 arrays... alle aufgerufen, die den gleichen Namen: anArray... und Sie würden alle anders? (Es gibt keine solche Sache wie ein GLOBALES array?)

etc. Um zu löschen Sie die alten Werte, die Methode removeAllObject kann nützlich sein.
Es gibt auch mutation Methoden, die verwendet werden können, um mehrere Werte auf einmal.

Also... zuerst habe ich auf "entfernen Sie alle Objekte"... und dann kann ich rufen EINE Methode es erneut hinzufügen alle meine neuen Werte.

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];
statt der alloc/init-Sequenz.

Wow. Ich dachte, nichts könnte gespeichert in einem array, ohne alloc ' Ing für ihn den Platz.

Wenn Sie wirklich wollen, zu ersetzen, das gesamte array, möchten Sie vielleicht zu prüfen,
mit Eigenschaften

Wie soll ich das tun mit Eigenschaften?
Was wäre der richtige Weg, so etwas zu tun:

> anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; 
> anArray = [NSMutableArray arrayWithObjects:@"four", @"fünf", @"sechs", nil]; 

Genau wie ich tun würde:

x = 12; 
x = 24; 

Wow. Ich WIRKLICH haben völlig missverstehen alles, was über strings, arrays und Speicher.
Ich dachte, die "einfach Weg" wurde alloc EINMAL... nutzen Sie die mutable-array... ändern Sie es so viel wie Sie wollen... und Kostenlose EINMAL.

Das problem dabei ist, dass dieses neue array nicht beibehalten,

Ich würde denken, dass das alte array wäre gegangen... und die neue Anordnung verwendet werden könnte.
(Aber ich denke mal nicht.)

Weiter, du hast ein Speicherleck, weil Sie nie befreit das original-array.

Ich dachte das alte array nicht angenommen, befreit zu werden... ich bin nicht fertig mit ihm... ich wünschte nur, es ÄNDERN zu enthalten meine neuen Werte. (Aber ich denke mal nicht.)

aber ist die Verwendung von [anArray release];

Dachte ich mir, das würde dazu führen, mich um den Speicher freizugeben, habe ich zugewiesen... (aber ich denke mal nicht)... und dann müsste ich wieder alloc mehr Speicher. (Aber ich denke mal nicht.)

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];

Also ich habe für "behalten" es... also es verschwindet nicht unter mir?
(Nicht sicher, warum es würde. Bis ich sagen, dass es... in meinem letzten dealloc nennen.)

Andere, wohl richtigere Weg, um es zu beheben wäre, um die addObject: oder
addObjectsFromArray: NSMutableArray Methoden statt ständig neue arrays.

Ich nur erstellen möchten EINE array... und es einfach verwenden, wie ich will.
Ich will nie HINZUFÜGEN auf das array. Ich möchte, um es an meine neuen Werte.

Ich weiß, dieser Beitrag ist Ewigkeiten alt im internet, aber ich möchte klarstellen, dass in Cocoa-Entwicklung sind wir im Grunde NIE wirklich Manipulation von Datenstrukturen selbst, sondern Zeiger auf diese. Halten Sie dieses im Verstand zu allen Zeiten, und denken Sie daran, dass Sie müssen sehr vorsichtig sein, mit Zeiger-Zuweisung.
Ich wünschte, ich könnte Ihnen mehr als ein up-vote - ich habe exakt die gleichen Probleme - Objective-C ist über counter-intuitive.

InformationsquelleAutor Bonnie | 2010-02-22

Schreibe einen Kommentar