2012-02-27 11 views
12

Próbuję dodać właściwość bez tworzenia zmiennej instancji. Czy można to zrobić? Czy możesz zrobić coś podobnego w sposób, który nie jest własnością?Dodać właściwość bez zmiennej instancji?

Przykład:

@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; 
} 

W powyższym kodzie, nie używam instancji zmiennej _value! Czy istnieje sposób, aby to zrobić bez tworzenia zmiennej?

Odpowiedz

8

Usuń linię

@synthesize value = _value; 

Skoro realizacji getter/setter samodzielnie, @synthesize nie jest pomocne.


@synthesize służy dwóm zadaniom. Pierwszym zadaniem jest połączenie właściwości z podkładem ivar, syntetyzując ivar, jeśli jeszcze nie istnieje. Drugim zadaniem jest zsyntetyzowanie gettera/setera. Jeśli nie potrzebujesz podkładu ivar, a sam wykonujesz implementacje dla pobierającego/ustawiającego, to w ogóle nie potrzebujesz @synthesize.

+0

Jeśli zamierzasz zadeklarować właściwość, niezależnie od tego, czy jest ona wspierana przez deklarowany ivar, czy nie, powinieneś otrzymać deklarację '@ synthesize' lub' @ dynamic'. OP ma prawdopodobnie deklarację '@ dynamic'. I w tym przypadku, i biorąc pod uwagę to, co jego komentarze mówią w kodzie, prawdopodobnie nie potrzebuje też zadeklarowanego ivar. – kamprath

+0

Tego właśnie szukałem! Wielkie dzięki! – tomidelucca

+5

@claireware: Wręcz przeciwnie, jeśli kompilator widzi, że metody są zaimplementowane, nie ma potrzeby stosowania '@ dynamic'. Zobacz ["Dyrektywy implementacji właściwości"] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW9): Możesz użyć dyrektyw '@ synthesize' i' @ dynamic' w blokach '@ implementation', aby wywołać określone akcje kompilatora. Zauważ, że żadna nie jest wymagana dla żadnej deklaracji "@ property".

Powiązane problemy