2015-11-12 7 views
5

Ich versuche hier meine Verwirrung zu beschreiben. Lassen Sie mich wissen, wenn diese Frage irgendeine Änderung benötigt.Ist es möglich, den Wert auf Readonly-Eigenschaft mit KVC in iOS zu setzen?

Accordind Apple documentaition: Reference for readonly property -

Apple documentation link

So können wir nicht gesetzt Wert Readonly-Eigenschaft, weil es Setter ist nicht erstellt. Aber ich habe ein Demo-Projekt zum Testen erstellt. Ich teile meine Code-Probe mit Ihnen.

Dies ist die Klasse "ModelTest1.h". Es hat eine schreibgeschützte Eigenschaft.

#import <Foundation/Foundation.h> 

@interface ModelTest1 : NSObject 

@property (readonly) NSMutableArray *arrTest; 

@end 

Jetzt setze ich Wert mit KVC. Da diese Eigenschaft schreibgeschützt ist, sollte es mir zur Laufzeit einen Fehler geben, aber es passiert nicht.

- (void)readonlyTest 
{ 
    ModelTest1 *obj1 = [ModelTest1 new]; 

    NSLog(@"obj1.arrTest before = %@",obj1.arrTest); 

    [obj1 setValue:[NSMutableArray new] forKey:@"arrTest"]; 

    NSLog(@"obj1.arrTest after = %@",obj1.arrTest); 

    [obj1.arrTest addObject:@"Str 1"]; 

    NSLog(@"obj1.arrTest after 2 = %@",obj1.arrTest); 

    [obj1 release]; 
} 

Ausgang ist:

Console output

ich nicht eine Sache, hier bin immer, warum wird der Speicher in NSMutableArray zugewiesen bekommen sogar nur lesbar ist. Und warum eine Zeichenfolge in diesem Readonly-Array hinzugefügt wird.

Ich habe diesen Speicherzuweisungstest mit NSString auch mit KVC und bekam das gleiche Ergebnis. Wert wurde auf schreibgeschützte Zeichenfolge mit KVC festgelegt.

Dies ist meine Verwirrung in Bezug auf SetValue für Readonly Eigenschaft.

Also habe ich etwas über Readonly-Eigenschaft missverstanden? oder ist da noch etwas anderes?

Antwort

10

Die Dokumentation Sie Gespräche und zwar um eine Setter-Methode nennen. Das ist nicht dasselbe wie KVC. KVC, standardmäßig sets the underlying instance variable directly, wenn keine Setter-Methode zum Aufrufen gefunden werden kann. So unterdrückt readonly die Synthese der Setter-Methode, aber das stoppt KVC nicht.

Sie können diese Funktion (KVC die Fähigkeit zu gehen direkt in die Instanzvariable) deaktivieren, indem Sie eine Klasse accessInstanceVariablesDirectly auf NO setzen, aber der Standard ist JA.

+0

Dank matt für so schnelle Antwort. Es löscht meine Verwirrung. Danke noch einmal! –

+1

Sie sind herzlich willkommen. Der Punkt, den du machst, wird ziemlich laut in meinem Buch genannt: http://www.apeth.com/iOSBook/ch12.html#_key_value_coding_2 – matt

+0

Ich habe mir dein Buch angesehen und ich muss sagen, dass es wirklich beeindruckend ist. Ich werde es definitiv studieren. Vielen Dank! –