/ / Dlaczego warto korzystać z instrukcji @synthesize - ios, target-c, właściwości

Po co używać instrukcji @synthesize - ios, target-c, properties

Kiedy po raz pierwszy dowiedziałem się o programowaniu na iOS (wydaje mi się, że było to na wykładach sprzed ARC Stanforda), zawsze zsyntetyzowaliśmy takie właściwości:

@synthesize myProperty=_myProperty

Wydaje się jednak, że tak właśnie było zachowanie domyślne przez chwilę. Tak więc pominięcie tego wyrażenia jest dokładnie tym samym, co pozostawienie go w.

Moje pytanie brzmi: biorąc pod uwagę to domyślne zachowanie, jakie są niektóre praktyczne przykłady gdzie faktycznie chcielibyśmy użyć instrukcji @synthesize?

Odpowiedzi:

5 dla odpowiedzi № 1

W systemie iOS 6 kompilator LLVM jest dostarczany z „autosyntezą właściwości”. Zasadniczo oznacza to, że kompilator doda @synthesize za każdy @property widzi w następującej formie:

@synthesize propertyName = _propertyName;

to znaczy, stworzy ivar z prefiksem podkreślenia i wygeneruje getter i setter za pomocą tego ivara.

Jest tylko jeden powód do korzystania @synthesize jawnie, a powodem jest zmiana nazwy ivar lub, na przykład, użycie tego samego ivar dla dwóch różnych właściwości.

Pamiętaj też, że w niektórych przypadkach musisz użyć @dynamic aby zapobiec syntezie. Zazwyczaj, gdy wiesz, że metody (getter lub setter) są już gdzieś zdefiniowane, ale kompilator ich nie zna.

Autosynteza nie ma wpływu na pamięć, więc nie jest w ogóle połączona z ARC.

Co się stanie, jeśli ręcznie zaimplementuję getter i setter?

Jeśli właściwość jest zapisywana, a Ty ją implementujeszzarówno setter, jak i getter lub jeśli właściwość jest tylko do odczytu, a implementujesz getter, nic nie zostanie zsyntetyzowane. Synteza odnosi się do automatycznej definicji dwóch metod. Dlaczego kompilator powinien syntetyzować coś, co już tam jest? Jeśli ręczne wdrożenie wymaga ivar, wystarczy zadeklarować ivar, nie trzeba go dodawać @synthesize żeby dodać ivara (chociaż możesz).

EDYTOWAĆ

Podczas używania zapomniałem jednego powodu @synthesize jest potrzebne i dotyczy to implementacji właściwości zadeklarowanej w protokole. Taka właściwość nie będzie autosyntezowana. Typowym przykładem jest [UIApplicationDelegate window].


2 dla odpowiedzi nr 2

@synthesize w celu-c po prostu implementuje obiekty ustawiające i pobierające właściwości:

- (void)setCoolWord:(NSString *)coolWord {
_coolWord = coolWord;
}

- (NSString *)coolWord {
return _coolWord;
}

Jest to prawdą w przypadku Xcode 4, że jest to zaimplementowanedla ciebie (iOS6 wymaga Xcode 4). Technicznie implementuje @synthesize coolWord = _coolWord (_coolWord jest zmienną instancji, a coolWord jest właściwością).

Aby uzyskać dostęp do tych właściwości, użyj self.coolWord zarówno do ustawienia self.coolWord = @ "YEAH!"; i dostawanie NSLog(@"%@", self.coolWord);

Należy również pamiętać, że zarówno ustawiający, jak i pobierający może być nadal ręcznie wdrażany. Jeśli wdrożysz ZARÓWNO seter i getter, chociaż POTRZEBUJESZ również ręcznie dołączyć @synthesize coolWord = _coolWord;

Dzięki automatycznej syntezie w iOS6 już nie jestkonieczne do konkretnego zadeklarowania kopii zapasowych lub napisania instrukcji @synthesize. Gdy kompilator znajdzie instrukcję @property, zrobi obie w naszym imieniu, korzystając z właśnie sprawdzonych wytycznych. Więc wszystko, co musimy zrobić, to zadeklarować taką właściwość:

@property (nonatomic, strong) NSString *abc;

a w iOS 6 @synthesize abc = _abc zostanie dodany automatycznie podczas kompilacji.


2 dla odpowiedzi nr 3

Nie musisz tego używać. Po prostu zadeklaruj swoje właściwości publiczne w ten sposób w swoim .h:

@property (nonatomic, strong/weak/assign) MyType *propertyName;

Więcej informacji o ARC tutaj

Uwaga dodatkowa:
@synthesize został użyty do połączenia właściwości ze zmienną klasy wewnętrznej. Odbywa się to automatycznie za pomocą ARC.