Frage

Was ist die beste Vorgehensweise zum Beibehalten und Freigeben von Objekten, die an Klassenmethoden übergeben werden?

Wenn Sie beispielsweise eine „Klassenvariable“ wie folgt deklariert haben:

static NSString *_myString = nil

...ist das Richtige dafür:

+ (void)myClassMethod:(NSString *)param {
    _myString = param;
}

...Dies hat den Nachteil, dass der Aufrufer einen Retain-Count ungleich Null für param aufrechterhalten muss, damit er nicht vorzeitig freigegeben wird.Alternativ könnte man dies tun:

+ (void)myClassMethod:(NSString *)param {
    [_myString autorelease];
    _myString = [param retain];
}

...was den Nachteil hat, dass es keine entsprechende Klassenebene gibt dealloc Rufen Sie es an, es wird Speicher verloren gehen.Oder sollte diese Art von Klassenvariablen-Schikanerei vollständig vermieden werden, vielleicht mit einer Singleton-Klasse, die die Lebensdauer dieser Art von Objekten auf konventionellere Weise verwaltet?

Hier sind Apples Dokumente zum Erstellen einer Singleton-Instanz.

Der Code, mit dem ich arbeite, ist das sehr raffinierte (aber immer noch neue) Objective Resource-Projekt (http://www.iphoneonrails.com/).

War es hilfreich?

Lösung

Behalten und loslassen, unbedingt.Es handelt sich nicht um ein Leck, da es das einzige Mal ist, dass eine Klasse stattfindet dealloc würde aufgerufen werden, wenn das Programm endet – zu diesem Zeitpunkt wird der Speicher ohnehin freigegeben.Die erste Möglichkeit wäre aufwändiger und verstößt gegen die Speicherverwaltungsrichtlinien von Cocoa.

Ob es eine Klassenmethode oder ein Singleton sein soll:Klassen selbst sollten im Allgemeinen nicht über viele unabhängige Funktionen verfügen.Sie wurden in Objective-C einfach nicht so entworfen, wie Sie am Fehlen von Klassenvariablen erkennen können.Klassenmethoden sollten sich im Allgemeinen mit der Erstellung und Verwaltung von Instanzen befassen und manchmal auch mit der Speicherung gemeinsamer Eigenschaften oder Standardeinstellungen für alle Instanzen.Die eigentliche Funktionalität einer Klasse sollte in Instanzen untergebracht werden.Das ist die Konvention in Objective-C.

(Natürlich gibt es keinen Objective-C-Gott und es steht Ihnen frei, Konventionen zu ignorieren, aber das ist die allgemeine Weisheit.)

Andere Tipps

Auch im Fall von NSString oder jeder Klasse, die wandelbar Varianten hat (wie NSArray oder NSDictionary), würde ich empfehlen, die Parameter zu kopieren, anstatt sie zu behalten. Wenn die Zeichenfolge der Anrufer Sie übergeben ein NSMutableString war, konnte seinen Wert später ändern, und es wird auch in Ihrer Klasse ändern. Dies ist wahrscheinlich nicht das, was Sie wollen, so würde ich rate dies zu tun:

+ (void)myClassMethod:(NSString *)param {
    [_myString release];
    _myString = [param copy];
}

Die copy Methode macht eine Kopie und setzt die Beibehaltungszähler auf 1, so dass Sie alle so weit wie Beibehaltung der Variable ist betroffen gesetzt. Und als Extra-Bonus, wenn der Anrufer Ihnen einen NSString nicht besteht, ist diese Klasse intelligent genug, um zu wissen, dass ihr Wert nicht ändern kann, so behält es einfach selbst eine Kopie des Objekts zu verhindern, dass. Wie klug ist das?

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