error: writable atomic property cannot pair a synthesized setter / getter with a user defined setter / getter
Ostatnio próbowałem skompilować starszy projekt Xcode (który kiedyś dobrze się skompilował), a teraz widzę wiele błędów w tej formie:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
Wzór kodu, który powoduje te błędy, zawsze wygląda tak:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Widzę, dlaczego błąd jest generowany. Mówię kompilatorowi, aby zsyntetyzował moje Accesory właściwości (zarówno getter, jak i setter), a następnie natychmiast po tym nadpisuję setter ręcznie. Ten kod zawsze trochę śmierdziało.
Więc, jaki jest właściwy sposób, aby to zrobić? Jeśli użyję@dynamic
zamiast @synthesize
, będę musiał napisać również getter. Czy to jedyny sposób? 4 answers
Miałem ten sam problem i po zrobieniu trochę badań, oto mój wniosek na ten temat:
Kompilator ostrzega Cię o @property
, które zadeklarowałeś jako atomic( tj. pomijając słowo kluczowe nonatomic
), jednak podajesz niekompletną implementację sposobu synchronizacji dostępu do tej właściwości.
Aby to Ostrzeżenie zniknęło:
Jeśli zadeklarujesz @property
jako atomowe, wykonaj jedną z następujących czynności:
- użyj
@dynamic
lub; - użyj
@synthesize
i keep the synthesized setter and getter or; - dostarcza ręczną implementację zarówno settera, jak i gettera (bez użycia jednej z powyższych dyrektyw).
Jeśli zadeklarujesz @property
z (nonatomic)
, możesz mieszać ręczne i syntetyzowane implementacje getterów i setterów.
Update: notatka na temat Autosyntezy właściwości
Począwszy od LLVM 4.0, CLang zapewnia autosyntezę dla deklarowanych właściwości, które nie są @dynamic
. Domyślnie nawet jeśli pominiesz @synthesize
, kompilator dostarczy Ci metody getter i setter. Jednak zasada dla właściwości atomowych jest nadal taka sama: albo niech kompilator dostarczy zarówno getter i setter, albo zaimplementuje je zarówno samemu!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-09 16:37:16
Musisz również zaimplementować getter. Przykład:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
- (void)setSomeProperty:(NSObject *)newValue
{
@synchronized (self)
{
// ...
}
}
- (NSObject *)someProperty
{
NSObject *ret = nil;
@synchronized (self)
{
ret = [[someProperty retain] autorelease];
}
return ret;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-12 14:12:30
To pytanie, wśród innych najlepszych hitów, które można uzyskać z wyszukiwania "objective C custom property", nie są aktualizowane o informacje o "setter =" lub " getter=".
Więc, aby dostarczyć więcej informacji na ten temat:
Możesz podać wywołanie @ property własną metodą, pisząc
@property(setter = MySetterMethod:, getter = MyGetterMethod)
Zwróć uwagę na dwukropek dla dostarczonej metody settera.
Reference Apple documentation
edytuj: Nie jestem do końca pewien, jak nowe zmiany w Właściwości Objective-C (są teraz znacznie bardziej inteligentne) zmieniają odpowiedzi na to pytanie. Być może wszystkie powinny być oznaczone jako nieaktualne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 12:03:47
Dla innych, którzy dostają ten błąd nie z opisanego powodu OP, prawdopodobnie masz ten sam problem co ja:
Masz właściwość @o tej samej nazwie co metoda - ().
Coś takiego:
@property UIView *mainView;
-(UIView *)mainView;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 03:31:54