Sollen wir alle unsere Instanzvariablen, die wir beibehalten möchten, in private Eigenschaften konvertieren oder fehlt mir etwas Offensichtliches?
%Vor%In diesem Beispiel wird someArray in einer Methode mit [NSMutableArray initWithObject: someObject] initialisiert, aber nicht beibehalten.
Meine besondere Situation ist, dass ich ein Spiel aktualisiere, es gibt viele Instanzvariablen, also möchte ich sicherstellen, dass ich das richtige für zukünftige Versionen des SDK tue.
Sollen wir alle lokalen Variablen konvertieren, die wir möchten? zu privaten Eigenschaften behalten oder fehlt mir etwas offensichtlich?
Erstens ist die Variable, die Sie in Ihrem Beispiel gezeigt haben, eine Instanzvariable, keine lokale Variable. Lokale Variablen werden innerhalb eines Codeblocks deklariert (z. B. innerhalb einer Funktion oder Methode oder innerhalb eines Unterblocks wie dem Rumpf einer Bedingungsanweisung) und haben eine Lebensdauer, die auf die Ausführung des Blocks beschränkt ist, in dem sie deklariert sind . Instanzvariablen sind in einer Klasse deklariert; Jede Instanz dieser Klasse erhält eine eigene Kopie der von der Klasse deklarierten Instanzvariablen.
Zweitens, nein, Sie müssen nicht alle Instanzvariablen in Eigenschaften konvertieren. Instanzvariablen werden standardmäßig als starke Referenzen unter ARC behandelt. Eine Eigenschaft ist eigentlich nur ein Versprechen, dass eine Klasse bestimmte Accessoren mit bestimmter Semantik bereitstellt. Wenn Sie nur eine Instanzvariable haben, müssen Sie keine Accessoren für diesen Ivar bereitstellen. (Manche mögen sagen, dass Sie sollten , aber Sie müssen nicht.)
Eine @property ist dieselbe wie eine Instanzvariable, es sei denn, Sie verwenden einen anderen als den standardmäßigen Speichermodifikator, der für Objekte stark ist. Beispiel: Wenn Sie @property (copy) NSString *s;
verwenden möchten, verwenden Sie entweder eine Instanzvariable und vergessen Sie nicht, jedes Mal, wenn Sie die Variable setzen, die Kopie aufzurufen, oder verwenden Sie die @property (was einfacher ist).
ARCs Version von retain
heißt strong
.
Grundsätzlich würden Sie es wie folgt deklarieren:
%Vor%Siehe Was macht das Keyword "strong" für Details?
Es ist im Allgemeinen besser, Eigenschaften anstelle von lokalen Variablen zu verwenden, weil die Eigenschaften Ihnen Zugriffsmethoden / Setter für "frei" verschaffen und in der Regel einfacher zu verwenden sind.
Sie beschreiben ein BAD_ACCESS Problem in einigen Ihrer anderen Kommentare. Hier läuft noch etwas anderes. In ARC sind deine Ivars stark, sofern sie nicht anderweitig qualifiziert sind (und in Nicht-ARC werden sie nicht in deinem Namen veröffentlicht).
Zum Beispiel funktioniert dieser ARC-Code einwandfrei, ohne BAD_ACCESS, da Sie in Ihren Kommentaren zu anderen Antworten berichten:
%Vor%Sie müssen uns vielleicht Ihr Beispiel zeigen, wo Sie Ihre BAD_ACCESS bekommen, weil es etwas anderes sein muss.
In Antwort auf die Frage "property" oder "ivar", während ich mit dem Argument "immer Eigenschaften verwenden" sympathisiere, benutze ich Eigenschaften für alles, für das ich externe Accessoren bereitstellen muss, und ich benutze private Ivars (nicht in der .h, sondern eher in der privaten Schnittstelle in der .m-Datei). Dies macht meine öffentlichen Schnittstellen in meinen .h-Dateien wirklich sauber und leicht zu verstehen, wenn ich Monate später zu ihnen zurückkomme. Wenn Sie den Ansatz "Immer Eigenschaften verwenden" verwenden, würde ich nur empfehlen, dass Ihre öffentliche Deklaration dieser Eigenschaften so restriktiv wie möglich sein sollte (machen Sie die Eigenschaft privat, wenn Sie können, machen Sie die öffentliche Deklaration der Eigenschaft nur lesend) Es muss kein Lesezugriff möglich sein.).
Übrigens, die Namenseigenschaften und Datentypen der Codierungsrichtlinien für Kakao ist eine gute Referenz der besten Praktiken.
Vielen Dank für Ihre Antworten.
Wenn ich die Methode, die das Objekt benötigt, (mit einer cocos2d game engine Methode) aufrufen:
%Vor%Das Objekt wird dereferenziert, wenn ich es direkt anrufe, ohne es in den cocos2d Scheduler zu schreiben:
%Vor%Dann gibt es noch einen gültigen Zeiger. Nur um es zu testen, behielt ich es und es bleibt um.
Die Frage ist nun, wie wir ein Zurückhalten erzwingen können, um zu verhindern, dass ARC denkt, dass wir damit fertig sind und es freigeben?Wenn Sie die Instanzvariable in eine private Eigenschaft ändern, wird dies sicher ausgeführt. Wir gehen damit als Antwort.
Tags und Links objective-c ios