2016-11-18 20 views
0

in Objective-C auf einer Nur-Lese-Objekteigenschaften einstellt Ich habe eine readonly Objekteigenschaft:Ist es in Ordnung

@property (readonly) MyCustomController* customController; 

MyCustomerController eine Eigenschaft namens myCustomProperty

Ist es in Ordnung, das Eigentum auf dem einzustellen readonly Objekt?

self.customController.myCustomProperty = [CustomProperty new]; 

Der Compiler beschwert sich nicht, und zur Laufzeit Funktionalität scheint fine-- es seltsam, ein wenig scheint nur zu sein, dass ich Eigenschaften auf einem readonly Objekt einstellen kann?
Obwohl technisch ich denke, ich "lese" die Eigenschaft, und dann eine Eigenschaft darauf festlegen, so bin ich technisch nicht setzen die tatsächliche readonly Eigenschaftszeiger.

Ist es eine schlechte Übung, dies zu tun? Kann etwas schief gehen?

Nach Rypress:

Das Nur-Lese-Attribut ist eine einfache Möglichkeit, eine Eigenschaft nur lesbar zu machen. Es lässt die Setter-Methode aus und verhindert die Zuweisung über Punktnotation, aber der Getter ist davon nicht betroffen. Als Beispiel können wir unsere Auto Schnittstelle zu den folgenden ändern. Beachten Sie, dass Sie mehrere Attribute angeben können, indem Sie sie durch ein Komma trennen.

So scheint es, wie es ist kein Problem, ich wollte nur

Antwort

3

überprüfen verdoppeln Obwohl technisch ich denke, ich „lesen“ die Eigenschaft bin, und dann auf eine Eigenschaft festlegen, so Ich setze den tatsächlichen readonly Eigenschaftszeiger technisch nicht ein.

Genau. Es ist nicht das Objekt, das schreibgeschützt ist, sondern Ihre Eigenschaft, die einen Verweis auf das Objekt speichert. Sie können nicht ändern, auf welches Objekt die Eigenschaft verweist, aber Sie können Methoden und Eigenschaften für dieses Objekt aufrufen, die seinen Status ändern.

Was Sie tun, ist vollkommen korrekt und normal.

1

Es ist hilfreich, daran zu denken, dass die "Punktsyntax" für den Zugriff auf Eigenschaften einfach syntaktischer Zucker zum Aufrufen von Zugriffsmethoden ist. Also, Ihre Aussage:

self.customController.myCustomProperty = [CustomProperty new]; 

wird (vorausgesetzt, die Zugriffs Namen nicht angepasst wurde) wörtlich entspricht:

[[self customController] setMyCustomProperty:[CustomProperty new]]; 

Beachten Sie, dass Sie nur den Getter für die customController Eigenschaft aufrufen. Das ist das readonly Attribut bedeutet für eine Eigenschaft: Es gibt einen Getter aber keinen Setter. Den Getter zu rufen ist natürlich völlig in Ordnung. Anders als beim Deklarieren des Typs hat die Eigenschaft keinen Einfluss darauf, was Sie mit dem abgerufenen Wert tun.

In jeder Form könnte man es in zwei getrennte Schritte zerlegen:

MyCustomController* controller = self.customController; 
controller.myCustomProperty = [CustomProperty new]; 

Beachten Sie, dass die customController Eigenschaft nur in der ersten dieser Linien beteiligt ist. Die zweite wird nur dadurch beeinflusst, dass controller vom Typ MyCustomController* und die (nicht gezeigte) Deklaration myCustomProperty ist.

Denken Sie an einen anderen Fall:

// Some method on some class: 
- (void) doStuffWithCustomController:(MyCustomController*)controller; 

// Your code, in a completely different class: 
[foo doStuffWithCustomController:self.controller]; 

Sicher, erkennt man, dass -doStuffWithCustomController: zum controller Parameter tun es kann alles erhält, die für eine MyCustomController Referenz gültig ist und es spielt keine Rolle, wo das Referenz herkam. Recht? So könnte es ohne Bedenken controller.myCustomProperty zuweisen. Nun, du auch.

Verwandte Themen