Objective-c moderne Laufzeitumgebung, die sowohl Eigenschaften als auch Ivars im Schnittstellenblock verwendet

8

Ich habe Codebeispiele (aus dem Buch "Beginn der iPhone 4-Entwicklung") gesehen, in denen sie sowohl iavs im Interface-Block deklarieren als auch Eigenschaften für sie deklarieren. So:

%Vor%

Was wäre der Zweck / Nutzen davon? Wie ich weiß, müssen Sie mit der modernen Runtime-Version (iPhone und 64-Bit-OS X-Anwendungen) nur Eigenschaften deklarieren und können die Ivars im Interface-Block deklarieren. Laut diese Antwort in einem similair Thread wäre es für Debugging-Zwecke. Aber gibt es noch andere Vorteile als das Debuggen, dass Sie diesen Ansatz verwenden würden?

Prost,

Peter

    
Peter Warbo 23.05.2011, 15:52
quelle

3 Antworten

5

Das explizite Deklarieren von Ivars gibt Ihnen die Möglichkeit, einen spezialisierten Typ für den ivar intern zu verwenden.

Ein typisches Beispiel ist ein intern veränderbares Objekt, auf das schreibend und unveränderlich von außen zugegriffen werden kann.

Beispiel:

%Vor%

Natürlich ist das von der Eigenschaft bars zurückgegebene Objekt nicht wirklich unveränderbar. Aber der Punkt ist, dass die API ihre Veränderlichkeit nicht offenbart.

Beachten Sie, dass ich den neuen Stil "Private-ivars-in-implement" verwendet habe. Es hängt sowohl von der modernen Laufzeit als auch vom Compiler ab.

    
Nikolai Ruhe 23.05.2011, 16:33
quelle
2

Einige Programmierer definieren ihre iVars gerne mit einem etwas anderen Namen, um zwischen direktem Zugang und KVC-Zugang zu unterscheiden. Zum Beispiel:

in der .h

%Vor%

und in der .m

%Vor%

Auf diese Weise greifen Sie direkt auf die iVar mit _table zu, aber Sie verwenden die synthetisierten Setter und Getter mit [self table]

    
Abizern 23.05.2011 16:37
quelle
1
  

Aber gibt es andere Vorteile als das Debugging, dass Sie diesen Ansatz verwenden würden?

Ich erkläre die Ivars explizit für:

  • Zugriffskontrolle (Sichtbarkeit)
  • Organisation
  • einheitlicher schriftlicher Stil
  • Kompatibilität (hey, dieses Programm könnte 32 Bit eines Tages unterstützen)
  • und weil ich Eigenschaften als Teil der öffentlichen Schnittstelle der Klasse assoziiere (obwohl Ausnahmen zu dieser existieren) - nicht einfach als Zugriffe auf die Klassen der Klasse.

"Alles als eine Lese- / Schreibeigenschaft" ist grundlegend fehlerhaft ood.

    
justin 23.05.2011 19:57
quelle