Objective C: Richtige Methode zum Initiieren eines NSArray, das eine @ Eigenschaft ist

7

Ich habe eine Eigenschaft in meiner Klasse, die ein NSArray ist. Ich behalte das Eigentum.

Meine Frage ist, was ist der richtige Weg, um Objekte zu diesem Array hinzuzufügen, ohne zu lecken und die Anzahl der Retains zu hoch zu machen?

Das ist was ich benutze:

%Vor%

// Ich stelle sicher, dass die Eigenschaft in meinem dealloc synthetisiert und freigegeben wird.

%Vor%

Ist das der richtige Weg?

    
Nic Hubbard 07.04.2011, 23:11
quelle

5 Antworten

7

Ja, das ist korrekt und meine bevorzugte Vorgehensweise, um den Code lesbarer zu machen.

Sie ordnen im Wesentlichen ein temporäres Array zu und weisen es dann Ihrer Eigenschaft mit einem Retain-Attribut zu, sodass es sicher ist, es aufzuheben, wenn Ihre Property es jetzt "besitzt". Denken Sie daran, dass Sie es immer noch in Ihrer dealloc -Methode veröffentlichen müssen.

Sie können das Array auch initialisieren und der Eigenschaft in der View-Controller-Init-Methode zuweisen, je nachdem, ob die Eigenschaft für Sie verfügbar sein soll, bevor die Ansicht tatsächlich geladen wird (dh, wenn Sie den Wert von die Eigenschaft vor dem Drücken der View-Controller usw. ...)

    
Rog 07.04.2011, 23:16
quelle
4

Normalerweise möchten Sie in diesem Fall die Eigenschaft copy deklarieren.

In den meisten Fällen sollten unveränderliche Auflistungsaccessoren kopiert, nicht beibehalten werden. Viele Leute machen sich das falsch und schreiben viel manuell und teilen Objekte, die nicht geteilt werden sollen. Sie denken, dass sie sich selbst gut tun, indem sie eine Ecke schneiden.

Kopieren in dieser Form (die Sammlung) ist flach. Die Objekte im Array werden nicht kopiert, sondern nur die Zuweisung des Arrays.

Eine gute Implementierung einer unveränderbaren Sammlung kann die Kopie einfach implementieren, indem sie self beibehält. Wenn das Argument änderbar ist, möchten Sie trotzdem eine Kopie (in den meisten Fällen).

Ihr Programm wird dann zu einer Deklaration vereinfacht:

%Vor%

und dann der Setter:

%Vor%

Natürlich müssen Sie init, dealloc und thread-safety entsprechend behandeln.

viel Glück

    
justin 07.04.2011 23:53
quelle
3

Das sieht gut aus. Sie brauchen die Variable tempFood nicht wirklich, Sie können einfach:

%Vor%

oder:

%Vor%     
Simon Whitaker 07.04.2011 23:15
quelle
3

Oder:

%Vor%

dann im Code

%Vor%

Dies vermeidet die von

benötigte automatische Freigabe %Vor%     
Terry Wilcox 07.04.2011 23:16
quelle
2

Ja, das ist richtig. Es ist auch gut zu bedenken, was @synthesize tatsächlich für Sie tut. Ein synthetischer (& amp; zurückgehaltener) Setter entspricht funktionell dem folgenden Code:

%Vor%

Grundsätzlich wird jedesmal, wenn Sie self.var = foo aufrufen, der zuvor gespeicherte Wert freigegeben und der neue gespeichert. Sie behandeln die Referenzzählung in Ihrem Code, und der Setter behandelt seine eigenen.

    
Matt J 08.04.2011 00:07
quelle

Tags und Links