2011-11-19 12 views
8

Così, ho già letto su documentazione quali noteQual è la differenza tra KVC e proprietà?

Objective-C sintassi del punto e la codifica di valori-chiave sono le tecnologie ortogonali di 2.0. È possibile utilizzare la codifica del valore chiave indipendentemente dal fatto che si utilizzi o meno la sintassi del punto e si può utilizzare la sintassi del punto indipendentemente dal fatto che si utilizzi o meno KVC. Entrambi, però, fanno uso di una "sintassi del punto". Nel caso della codifica del valore chiave, la sintassi viene utilizzata per delimitare gli elementi in un percorso chiave. È importante ricordare che quando si accede a una proprietà utilizzando la sintassi del punto, si invocano i metodi standard di accesso del ricevente.

E 'quindi fornito un esempio che presumibilmente ha mostrato la differenza tra i due. Tuttavia, non riesco ancora a ottenere, qual è la differenza tra KVC e metodi di accesso alla proprietà? Non sono gli stessi? E come faccio a distinguere tra i punti che chiamano setValue: forKeyPath: e semplici accessor?

risposta

14

Tuttavia, ancora non capisco, qual è la differenza tra KVC e accessor immobili metodi?

KVC è un modo per chiamare metodi di accesso proprietà o accedere in altro modo a una proprietà.

Che cosa intendo per "altrimenti accesso"? Ai fini di KVC, una variabile di istanza senza metodi di accesso conta come una proprietà informale. Otterrà o imposterà direttamente il valore della variabile di istanza se non è possibile trovare alcuna coppia di accessor corrispondente. (Sì, non vale la pena usare il codice moderno. Dichiara sempre uno @property per qualsiasi cosa tu intenda accedere altrove e, inversamente, non utilizzare KVC per accedere a qualsiasi cosa che non sia di proprietà pubblica.)

Proprietà i metodi di accesso sono quelli che KVC chiamerà se esistono (preferito, sia da KVC che da ogni programmatore sano, tramite accesso diretto a ivar). Un accessor può ottenere o impostare una variabile di istanza, come fanno gli accessors sintetizzati, o accedere ad altri archivi.

Gli accessi sono implementazione, le proprietà sono interfaccia e KVC è un modo per utilizzarli.

E come faccio a distinguere tra i punti che chiamano setValue: forKeyPath: e semplici accessor?

Un percorso chiave è una stringa, mentre un'espressione di accesso proprietà è un'espressione. Il compilatore valuta un'espressione di accesso proprietà e la traduce in uno o più messaggi Objective-C, mentre un percorso chiave viene valutato da KVC in fase di esecuzione.

Così, quando si utilizza un percorso chiave:

[someObject setValue:theValue forKeyPath:@"foo.bar.baz"]; 

Sai che è un percorso chiave perché (1) è una stringa, come indicato in questo caso per la stringa letterale sintassi @"…", e (2) stai passando la stringa del percorso chiave a setValue:forKeyPath: per la valutazione.

L'utilizzo di un percorso chiave utilizza KVC per accedere alle proprietà denominate. Invierà qualsiasi messaggio di accesso pertinente per tuo conto.

Quando si utilizza un'espressione di proprietà di accesso:

someObject.foo.bar.baz = theValue; 

Sai che è un'espressione di accesso alle proprietà, perché non si individuando le proprietà con una stringa. Stai accedendo a loro (inviando i messaggi di accesso) tu stesso, nel tuo codice.

Non ci sono molti motivi per utilizzare KVC in qualsiasi forma; quando si conosce la proprietà su authorship/compile time, è meglio avere un @property dichiarato e accedere alla proprietà da soli, sia con espressioni di accesso di proprietà o espressioni di messaggi ([[[someObject foo] bar] setBaz:theValue]). Il tempo di usare KVC è quando non sai a quale proprietà vuoi accedere fino al tempo di esecuzione, il che è piuttosto raro. È principalmente una tecnologia a blocchi di edifici dietro KVO, Cocoa Bindings, parti di Core Animation, ecc.

Principalmente, si desidera solo accedere alle proprietà da soli.

+4

** "Il tempo di utilizzare KVC è quando non si sa a quale proprietà si desidera accedere fino al runtime" ** dalla propria risposta è quello che stavo cercando, grazie. – km3h

+0

E 'stato davvero utile per me. Avevo in mente che ** Il tempo di usare KVC è quando non sai a quale proprietà vuoi accedere fino al tempo di esecuzione, ** questo potrebbe essere il motivo ma non ne ero sicuro. Mi hai dato fiducia nel mio pensiero. –

+0

Peter you state ", e, inversamente, non utilizzare KVC per accedere a qualsiasi cosa che non sia una proprietà pubblica."Ho appena scoperto che se una proprietà viene dichiarata di sola lettura e quindi dichiarata nuovamente come read-write nell'implementazione, KVC scriverà senza vergogna su quella proprietà." Non c'è modo di bloccarlo? Ho provato (BOOL) accessInstanceVariablesDirectly { return NO;} ma ciò non impedisce a KVC di scrivere sulla proprietà. –

2

La codifica del valore chiave consente di impostare e ottenere il valore delle proprietà tramite il codice utilizzando il nome stringa della proprietà. Per esempio, se ho avuto una proprietà denominata foo che è di tipo NSString:

[self setValue:@"mystring" forKey:@"foo"]; 

// read the value by key 
NSString *s = [self valueForKey:@"foo"]; 

sintassi Dot è compilare zucchero sintassi. Come una preferenza personale (alcuni non sono d'accordo - fine) Io non uso la sintassi del punto, ma ho ancora utilizzare KVC:

[myObj setFoo: @"someString"] 

è uguale:

myObj.foo = @"someString"; 

Essi sono ortogonali, concetti diversi ma entrambi riguardano il modo in cui interagisci con le proprietà

Infine, si cita la sintassi della proprietà. Ancora un altro concetto ortogonale ma correlato alla gestione delle proprietà.

Con obiettivo-c, la convenzione è importante. Seguirli Le proprietà sono il nome della proprietà per il get e set [Nome] per l'assegnazione:

- (NSString*)foo 
{ 
    return _foo; // defined as (NSString*)_foo in header 
} 

- (void) setFoo: (NSString*)foo 
{ 
    if (foo == _foo) 
     return; 

    NSString* curr = _foo; 

    _foo = [foo retain]; 
    [curr release];  
} 

Ora, chi vuole scrivere qualcosa di simile che ogni volta. Quindi, immettere la sintassi @property:

In intestazione:

@property (retain) NSString *foo; 

Poi nel .m:

@synthesize foo; 

Questo è l'equivalente di scritte a mano i accesso alle proprietà. È lo zucchero della sintassi del compilatore che espande il codice della proprietà in base a come le attribuisci.

Documenti:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

Problemi correlati