2012-02-27 13 views
12

Sto tentando di aggiungere una proprietà senza creare una variabile di istanza. È possibile farlo? O puoi fare qualcosa di simile in un modo che non è una proprietà?Aggiungi una proprietà senza variabile di istanza?

Esempio:

@interface RandomClass() 
@property (nonatomic) int value; 
@end 

@implementation RandomClass 
@synthesize value = _value; 
// Here I override the default methods @synthesize 
-(int)value 
{ 
     return 8; // Actually I'm returning something more complex, so a "define" won't work 
} 
-(void)setValue:(int)value 
{ 
    self.someOtherValue = value; 
} 

Nel codice di cui sopra, non sto utilizzando l'istanza variabili _value! C'è un modo per farlo senza creare la variabile?

risposta

8

rimuovere la linea

@synthesize value = _value; 

Dal momento che si sta implementando il getter/setter te stesso, il @synthesize non è utile.


@synthesize serve due lavori. Il primo compito è quello di connettere la proprietà ad un ivar di supporto, sintetizzando l'ivar se non esiste già. Il secondo lavoro è sintetizzare il getter/setter. Se non hai bisogno del supporto di supporto, e se stai fornendo implementazioni per il getter/setter te stesso, allora non hai bisogno del @synthesize.

+0

Se dichiarate una proprietà, indipendentemente dal fatto che sia supportata da un ivar dichiarato o no, dovreste avere una dichiarazione '@ synthesize' o' @ dynamic' per esso. L'OP ha probabilmente una dichiarazione '@ dynamic'. E in tal caso, e dato ciò che i suoi commenti dicono nel codice, probabilmente non ha nemmeno bisogno del dichiarato ivar. – kamprath

+0

Questo è quello che stavo cercando! Ottimo grazie! – tomidelucca

+5

@claireware: al contrario, se il compilatore può vedere che i metodi sono implementati, non c'è bisogno di '@ dynamic'. Vedere ["Direttive di implementazione della proprietà"] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW9): È possibile utilizzare le direttive '@ synthesize' e' @ dynamic' nei blocchi '@ implementation' per attivare azioni specifiche del compilatore. Nota che nessuno dei due è richiesto per una qualsiasi dichiarazione '@ property'.

Problemi correlati