12

Mögliche Duplizieren:
Is literal creation of an NSMutableDictionary less efficient than the class helper method?eine NSMutableArray mit einem wörtlichen über mutableCopy oder arrayWithArray erstellen:

Nach dem WWDC Video, das ObjectiveC Literale einführt, kann NSMutableArray s wie so initialisiert werden:

[NSMutableArray arrayWithArray:@[]]; 

aber was wäre, wenn wir es tun würden wie t his:

Ich weiß, dass man das Array initialisiert, und das andere ist nur eine flache Kopie; daher ist die Speicherverwaltung anders. Aber wenn wir ARC verwenden, was sind die Nachteile der Verwendung von ARC? Ist es teurer? ARC behandelt wahrscheinlich beide unterschiedlich, aber ich frage mich nur, ob die Verwendung von mutableCopy "schlechter" ist oder nicht.

+1

Was ist mit '[NSMutableArray Array]'? –

Antwort

5

Im ersten Fall haben Sie zwei Objekte, die zum aktuellen Autorelease-Pool hinzugefügt wurden: das NSArray-Literal und das NSMutableArray, das Sie daraus erstellen. Im letzteren Fall wird das Literal-NSArray zum Autorelease-Pool hinzugefügt, das von ihm kopierte NSMutableArray jedoch nicht. So ist der erste Fall etwas schlechter, leistungsmäßig, in dem das Entleeren des Autorelease-Pools (zB am Ende des Run-Loop-Zyklus) die Freigabe beider Objekte nacheinander erfordert, während im zweiten Fall die Kopie getrennt freigegeben wird aus dem Autorelease-Literal. In der Praxis wird der Zeitunterschied infinitesimal sein.

+0

interessant! Das erklärt einiges. Vielen Dank. – KDaker

+5

Unter ARC sind nicht benötigte Autoreleases oft optimiert, so dass selbst das wahrscheinlich kein großes Problem ist. –

+0

Das ist nicht unbedingt der Fall. Als ich das letzte Mal getestet habe, scheint Foundation nicht mit ARC kompiliert worden zu sein. Dies ist wichtig, denn beim Kompilieren mit ARC fügt clang 'return [retVal autorelease] nicht ein;' - es fügt tatsächlich return objc_autoreleaseReturnValue (retVal); 'ein. Ebenso ruft der Aufrufer (Ihr Code) das Ergebnis nicht "-retain" auf, sondern ruft "objc_retainAutoreleasedReturnValue" auf. Die Kombination dieser beiden Funktionen um diese Methode führt dazu, dass das Objekt nie tatsächlich in den Autorelease-Pool eintritt. Sonst landet es immer noch dort. –

Verwandte Themen