Einstellen eines Objekts Null im Vergleich zu Release + realloc

stimmen
9

Das ist kein Müll gesammelt Umgebung

Ich habe eine Klasse Instanzvariable, die an einem gewissen Punkt in meiner Laufzeit, ich brauche mit einem anderen Datensatz neu zu initialisieren, als es ursprünglich mit errichtet wurde.

Hypothetisch gesprochen, was passiert , wenn ich eine habe NSMutableArrayoder NSMutableDictionarywäre es effizienter sein , etwas zu tun , wie zum Beispiel:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

oder nur,

myArr = nil;

Wird myArr das Objekt freigeben und mich auf die Speicherung im Speicher ohne Zeiger verlassen, so kann ich wieder Verwendung myArr?

Veröffentlicht am 09/03/2009 um 17:03
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
21

Wenn Sie das tun myArr=nil;selbst, dann haben Sie den Zeiger auf dem verloren Sie senden können releaseNachricht an. Es gibt keine Magie , um releaseIhr Objekt.

Und, wie Georg sagt, ohne das Objekt in der Lage zu lösen, dass der Speicher hat ‚durchgesickert‘.

Beantwortet am 09/03/2009 um 17:07
quelle vom benutzer

stimmen
6

Sie könnten eine Eigenschaft verwenden, und fast die Syntax, die Sie ohne das Speicherleck wollen bekommen.

Verwenden diese Syntax das Array zu erklären

@property (readwrite, retain) NSMutableArray *myArray;

Dann neu initialisieren es wie folgt aus:

[self setMyArray:[NSMutableArray array]];
Beantwortet am 09/03/2009 um 17:59
quelle vom benutzer

stimmen
5

Wenn Sie auf Mac OS sind, nicht iPhone OS würde ich sagen, dass es davon abhängt, ob der Garbage Collector aktiviert ist oder nicht:

  • mit GC: Verwendung myArr = nil;
  • ohne GC: Verwendung [myArr release];

Leider auf dem iPhone, gibt es keine Müllabfuhr, so dass, wenn Sie nicht über Speicherlecks wollen, müssen Sie Ihr Objekt freigeben, wenn Sie nicht mehr benötigen.

Beantwortet am 09/03/2009 um 17:13
quelle vom benutzer

stimmen
4

Der erste Codeblock ist in Ordnung. Allerdings ist der zweite Block nicht mit einem Array lassen können Sie verwenden, so ist es nicht ausreichend. Die Hälfte diesen Block zu korrigieren, ich glaube, Sie bedeuten:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Allerdings bedeutet dies nicht erreichen, was Sie wollen entweder, weil Sie nicht myArr freigibt. Wenn Sie einen Setter für myArr synthetisiert haben, dann können Sie das Freisetzungsverhalten Sie von der Einstellung auf Null wollen erhalten, indem Sie die Setter mit (self.myArr) anstelle der Zeiger für den Zugriff direkt (myArr). Korrigieren Sie Ihren zweiten Block vollständig:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Jetzt haben wir entsprechende Code Beispiele, eine mit Setter mit null zu lösen, die andere nicht. Sie sind gleich.

Wenn myArr ein veränderliches Array wie in diesen Beispielen ist, ist die effizienteste Methode removeAllObjects zu verwenden, vermeidet die ganze Arbeit von Speicher Freigabe nur zu zurückzufordern:

[myArr removeAllObjects];
Beantwortet am 02/12/2009 um 11:08
quelle vom benutzer

stimmen
1

Wenn das, was Sie wollen, ist, den Inhalt eines NSMutableArray / NSMutableDictionary zurückgesetzt werden, können Sie auch removeAllObjects nennen, und Sie haben ein neues Array / dict mit zu arbeiten.

Beantwortet am 13/03/2009 um 22:37
quelle vom benutzer

stimmen
1

Eine Möglichkeit, den Unterschied zu erkennen, könnte dies sein: Festlegen eine Referenz auf ein Objekt auf Null tut nichts, um das Objekt, es tut nur etwas zur Referenz.

„Freigeben des Objekts“ ist nicht „nichts“, so dass er tut das nicht. :) In einer Garbage Collection Sprache könnte es, dass als Nebeneffekt tun, um die Referenz fallen zu lassen, aber in Objective C funktioniert es nicht so.

Beantwortet am 09/03/2009 um 17:09
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more