Einstellung ein Objekt null versus release+realloc
Dies ist keine garbage Collection-Umgebung
Habe ich eine Instanz der Klasse variable, die an einem Punkt in meiner Spielzeit, die ich brauchen, um neu zu initialisieren Sie mit einem anderen Datensatz als es ursprünglich konstruiert wurde, mit.
Hypothetisch gesprochen, was, wenn ich einen NSMutableArray
oder eine NSMutableDictionary
ist, wäre es effizienter sein, etwas zu tun wie:
[myArr release];
myArr = [[NSMutableArray alloc] init....];
oder einfach nur,
myArr = nil;
Wird myArr release das Objekt, und lassen Sie mich ohne ein Zeiger auf den Speicher in den Speicher, so kann ich re-verwenden myArr?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
myArr=nil;
von selbst, dann haben Sie verloren Sie den Mauszeiger an die Sie senden können, dierelease
Nachricht an. Es gibt keine Magie, umrelease
Ihr Objekt.Und, wie Georg sagt, ohne in der Lage zu release Ihres Objekts, dass der Speicher in "durchgesickert".
Könnten Sie eine Eigenschaft und bekommt kaum die syntax, die Sie wollen, ohne den Speicherverlust.
Verwenden Sie die folgende syntax zum deklarieren des Arrays
Dann neu initialisieren es so:
Wenn Sie auf Mac OS, nicht das iPhone OS, ich würde sagen, es hängt davon ab, ob der garbage collector aktiviert ist oder nicht:
myArr = nil;
[myArr release];
Leider auf dem iPhone, es gibt keine garbage collection, so dass, wenn Sie nicht möchten, dass memory leaks, die Sie haben, lassen Sie Ihre Objekt, sobald Sie es nicht mehr benötigen.
Der erste code-block ist in Ordnung. Aber der zweite block nicht verlassen werden Sie mit einem array, das Sie verwenden können, so ist es nicht ausreichend. Die Hälfte korrigiert wird, der block, ich denke du meinst:
Allerdings bedeutet dies nicht das erreichen, was Sie wollen, entweder weil Sie nicht loslassen myArr. Wenn Sie synthetisiert ein Trendsetter für die myArr, dann können Sie die release-Verhalten, das Sie möchten aus dem setzen auf null, mithilfe der setter (self.myArr) statt den Zugriff auf den Zeiger direkt (myArr). Korrektur Ihrer zweiten block voll:
Nun, wir haben die gleichen code-Beispiele, die man über setter mit nil zu lösen, die andere nicht. Sie sind die gleichen.
Wenn myArr ist ein veränderliches array wie in diesen Beispielen, die am meisten effiziente Methode ist die Verwendung removeAllObjects, die Vermeidung all die Arbeit, das freigeben von Speicher nur zu behaupten, es zurück:
[NSMutableArray array]
), und dann verwenden der array-Accessoren, um füllen Sie es aus. developer.apple.com/mac/library/documentation/Cocoa/Conceptual/... natürlich, wenn Sie gehen, bevölkern die new array sofort, es wäre effizienter, dies mit den neuen array in eine lokale variable, dann setzen Sie die Eigenschaft auf das fertige array. Und eine dieser Methoden wäre nicht erforderlich, wenn die Eigenschaft aufnil
ersten.Einen Weg zu erkennen, der Unterschied wäre diese: Setzen Sie einen Verweis auf ein Objekt zu null tut nichts, um das Objekt, es funktioniert nur etwas die Referenz.
"Die Freigabe des Objekts" ist nicht "nichts", also es nicht tun. 🙂 In ein garbage Collection-Sprache, die es tun könnten, das als Nebeneffekt fallen die Referenz, aber in Objective-C es funktioniert nicht so.
Wenn das, was Sie wollen, ist das zurücksetzen der Inhalt eines NSMutableArray/NSMutableDictionary, Sie können auch anrufen removeAllObjects und Sie haben eine frische array/dict, mit zu arbeiten.