2009-09-04 9 views
3

Ich lese die ersten Kapitel von Cocoa Programming für Mac OS X erneut und der Autor gibt an, dass eine der Klassenmethoden NSCalendarDate ein automatisch freigegebenes Objekt zurückgibt. Ich nahm immer an, dass alle Klassenmethoden ein automatisches Objekt zurückgaben (da alloc nicht beteiligt ist).Liefern alle Klassenmethoden ein automatisch freigegebenes Objekt?

Gibt es Klassenmethoden, die Sie gezielt beibehalten müssen?

Danke.

+1

Wenn eine Methode kein automatisch freigegebenes Objekt zurückgegeben hat, müssen Sie das Ergebnis * technisch * nicht behalten. Es würde entweder bereits beibehalten oder der Code wäre fehlerhaft, sodass das zurückgegebene Objekt möglicherweise bereits freigegeben wird. – Chuck

Antwort

22

Klassenmethoden sollten genau wie Instanzmethoden dem Standard Cocoa memory management rules entsprechen.

Sie nehmen Besitz eines Objekts, wenn Sie es mit einer Methode, deren erstellen Namen beginnt mit „alloc“ oder „neu“ oder enthält „Kopie“ (zum Beispiel alloc, newObject oder mutableCopy) oder wenn Sie senden Sie eine Retain-Nachricht. Sie sind verantwortlich für den Verzicht auf Besitz von Objekten, die Sie besitzen Release oder Autorelease. Jedes andere Mal erhalten Sie ein Objekt, das Sie nicht freigeben müssen.

Vermutlich geben sie ein automatisch freigegebenes Objekt oder einen Verweis auf ein Singleton oder etwas ähnliches zurück. In beiden Fällen müssen Sie das Objekt erst freilassen, wenn es mit "alloc" oder "new" oder "copy" gestartet wurde. Sie müssen es nicht beibehalten, es sei denn, Sie möchten es über den Umfang des aktuellen Autorelease-Pools hinaus behalten, indem Sie es in einer iVar oder ähnlichem speichern.

+3

Um einen Punkt zu verdeutlichen: Im Falle eines Singleton * besitzt die Klasse * ihre einzige Instanz, weshalb sie sie nicht freigibt oder wieder freigibt. In allen anderen Fällen (in der Regel Convenience-Factory-Methoden wie 'stringWithUTF8String:') beabsichtigt die Klasse nicht, die Instanz zu besitzen, also wird sie automatisch freigegeben. –

+1

Um zu bekräftigen, was Joey gesagt hat - das Einzige, was Ihnen wichtig ist, ist der Objektbesitz, wie er in den Cocoa-Speicherverwaltungsregeln festgelegt ist. Die Frage ist "besitze ich das zurückgegebene Objekt" und nicht "die Methode, die ich Autorelease genannt habe". –

+0

+1 für eine gute Antwort. Sehen Sie meine Antwort für eine kleine zusätzliche Analyse. –

0

Die allgemeine Regel ist, wenn der Name der Methode Alloc, neu oder Kopie enthält, dann besitzen Sie es. Andernfalls kann es sein, dass es automatisch freigegeben wird oder dass es von jemand anderem verwaltet wird, d. H. Sie besitzen es nicht, so dass Sie sich nicht darum kümmern müssen.

1

Convenience-Methoden geben normalerweise automatisch freigegebene Objekte zurück. Z.B. [NSMutableArray array] entspricht [[[[NSMutableArray alloc] init] autorelease].

Die Tatsache, dass dies Klassenmethoden sind, sollte nicht zu der Schlussfolgerung führen, dass alle Klassenmethoden automatisch freigegebene Objekte zurückgeben. Es geht um die Namenskonvention. Wenn das Menthod eine Zuweisung *, Kopie, neue * Name hat, dann werden Sie der Besitzer des zurückgegebenen Objekts sein. I.e. Es wird eine Retain-Anzahl von mindestens 1 haben, wenn es an Sie weitergegeben wird.

1

Es ist erwähnenswert, dass Klassenmethoden erinnern haben keine ein Objekt überhaupt zurückkehren - jede Methode kann etwas (einschließlich structs, Urtyp, etc.) zurückgeben oder nichts (void). Es gibt nichts in der Objective-C-Sprache, das Klassenmethoden erfordert, um ein unowned-Objekt zurückzugeben (was bedeutet, dass der Aufrufer es nicht freigeben/automatisch freigeben muss).

Das sagte, @ Joey's Antwort ist eine großartige Antwort. Die Faustregel für Klassenmethoden, die ein Objekt zurückgeben, ist, dass es automatisch freigegeben werden soll. Abweichungen von den Konventionen sollten klar dokumentiert werden, um Speicherverluste im Client-Code zu vermeiden.

Verwandte Themen