Frage

Ich bin, die eine Zahl, wie folgt:

NSNumber *nn0 = [NSNumber numberWithInt:0];

Es funktioniert ohne alloc in Ordnung. Mein Verständnis ist, dass, wenn ich numberWithInt verwenden, alloc und init automatisch aufgerufen werden.

Wenn ich am Ende meiner Funktion zu lösen versuchen, ich auf Probleme stoßen:

[nn0 release];

Ich erhalte einen Laufzeitfehler.

Meine Frage ist: wenn ich numberWithInt verwenden, um die NSNumber zu initialisieren, muss ich auf sie jede Speicherverwaltung zu tun haben

War es hilfreich?

Lösung

Die „Convenience Bauer“ für viele Arten produzieren ein Objekt, das automatisch „Autoreleased“ ist - von der aktuellen NSAutoreleasePool beibehalten werden heißt das neue Objekt. Sie müssen nicht manuell diese Objekte freizugeben -. Sie freigegeben werden, wenn der Strom NSAutoreleasePool freigegeben / abgelassen

Sehen Sie diese Seite für eine Beschreibung der Bequemlichkeit Bauer, und wie der Speicher für diese Räude.

http: // www. macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

Andere Tipps

Folgen Sie einfach der Kernspeicher-Management-Regel: Wenn Sie „eigene“ die Variablen, man muss schließlich Eigentum verzichten. Sie nehmen Besitz von: Erstellen Sie das Objekt (alloc / neu / Kopie) oder speziell Besitz nehmen (behalten). In all diesen Fällen sind Sie verpflichtet, es zu veröffentlichen.

Wenn Sie das Objekt müssen dableiben, müssen Sie Eigentum an, es zu nehmen. Wenn Sie also wissen nur Sie die Nummer für diese Methode benötigen (wie es in einem Array zu übergeben oder was auch immer), die bequeme Methode verwenden und es einfach dabei belassen. Wenn Sie die Nummer aus irgendeinem Grunde (und Instanz-Variable, zum Beispiel) halten wollen, dann können Sie sicher / init es Alloc.

Wenn Sie etwas freigeben, die Sie nicht besitzen, erhalten Sie einen Laufzeitfehler erhalten.

Die Regel ist einfach, mit wenigen Ausnahmen:

  

Wenn der Wähler ein Objekt Rückkehr hat das Wort „neu“, „alloc“, „behalten“ oder „Kopie“ in ihm, dann besitzen Sie das zurückgegebene Objekt und sind verantwortlich für die Freigabe es, wenn Sie fertig sind.

Ansonsten Sie besitzen nicht und sollte es nicht loslassen. Wenn Sie einen Verweis auf ein nicht-Besitz Objekt behalten möchten, sollten Sie -[NSObject retain] auf dieser Instanz aufrufen. Sie können nun „eigene“ die Instanz daher ein muss -[NSObject release] auf der Instanz aufrufen, wenn Sie mit ihm fertig sind. So besitzen Sie nicht die Instanz von -[NSNumber numberWithInt:] zurückgekehrt und sollte es nicht nennen -release, wenn Sie fertig sind. Wenn Sie die zurückgegebene Instanz über den aktuellen Bereich (wirklich über die gesamte Lebensdauer der aktuellen NSAutoreleasePool Instanz) behalten mögen, sollten Sie es -retain.

In RegEx Begriffe, Peter Hosey legt es sehr schön aus in seinem Blog . Sie besitzen die zurückgegebene Objekt-Instanz, wenn der Methodenselektor diese regex entspricht:

/^retain$|^(alloc|new)|[cC]opy/

Natürlich ist die definitive Referenz ist die Memory Management Programming Guide für Cocoa .

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