Frage

Ich kann eine Klasse mit einer Eigenschaft definieren, um von außerhalb der Klasse auf meine IVARs zuzugreifen.

Ich kann auch nur die MyInst-> Ivar-Syntax verwenden, um in C-Struct-Weise zugreifen zu können.

In C ++ würde ich mit Zubehör gehen, aber in Objective-C gibt es einige Fälle, in denen ich möglicherweise direkten Zugriff möchte. Das Messaging -System verursacht eine große Leistung, die mit dem Accessor in einigen Kontexten wichtig ist, da die Nachricht nicht so eingebaut wird, wie sie mit C ++ - Methoden sein kann.

Zum Beispiel in einer Klasse, in der ein Ivar namens Scalar und eine Eigenschaft definiert ist. Scalar ist ein einfacher Schwimmerwert:

-(void) doWorkWithMyClass:(MyClass*)myinst
{
   // array and other locals declaration omitted 
   for (int i = 0; i < reallyBigX; i++) {
      result += [myinst scalar] * array[i];
      [myinst computeNextScalar:i];
   }
}

Wenn ich [myinst scalar] in myInst-> scalar ändere, wird die Methode viel schneller ausgeführt, da die Verwendung von Anrufen mit dem Accessor den größten Teil der CPU in dieser Schleife aufnehmen würde.

Wie bei C ++ verstehe ich den direkten IVAR -Zugang im Allgemeinen entmutigt, aber in diesem Zusammenhang, wenn Geschwindigkeit wichtig ist, ist er akzeptabel? Wenn nicht, gibt es eine bevorzugte Methode, bei der immer noch eine Objektiv-C-Klasse verwendet wird?

War es hilfreich?

Lösung

Viele Dinge werden akzeptabel, wenn es einen erheblichen Einfluss auf die Leistung hat, aber in dem Beispiel, das Sie geben, scheinen es viel bessere Lösungen zu geben.

Erstens, warum nicht [myinst computeNextScalar:i] den neuen Skalar zurückgeben? Wenn Sie das tun würden, müssten Sie es nicht holen und alles wäre viel schneller.

Kann die Arbeit nicht eingezogen werden myinst? Ich meine, kannst du nicht so etwas erstellen wie:

result = [myinst totalOverArray:array];

Wenn reallyBigX ist wirklich groß, dann sollten Sie hier die Beschleunigung in Betracht ziehen. Es kann die Leistung bei der Art der Operation, die Sie zu erledigen scheinen, erheblich verbessern. (Sie müssen Leistungstests mit dem Beschleunigungsrahmen durchführen. Für einige Operationen kann es wesentlich langsamer sein, aber dieser könnte schneller sein.)

Betrachten Sie schließlich das Ziel-C get... Muster. Es sieht aus wie das:

int *scalars = calloc(reallyBigX, sizeof(int));
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)];
for (int i = 0; i < reallyBigX; i++) {
   result += scalars[i] * array[i];
}
free(scalars);

Übrigens ist das obige definitiv ein Kandidat für vDSP_dotpr(), obwohl Sie es aufführen sollten. In vielen Fällen ist die einfache Schleife schneller als ein Äquivalent vDSP Rufen Sie an, wenn Stride = 1 += stride).

Andere Tipps

Ja, es ist akzeptabel: die @public, @private, usw. Zugangsmodifikatoren wurden teilweise eingeführt, um Entwürfe zu unterstützen, bei denen der Zugriff auf IVARs von außerhalb der Klasse erforderlich ist. Sie sollten es jedoch vermeiden, direkt an Ivars zu schreiben.

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