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?
Author: e.James, 2010-07-12

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!

 218
Author: octy,
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;
}
 14
Author: arturgrigor,
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.

 12
Author: Matias Forbord,
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;
 0
Author: Albert Renshaw,
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