Wyjaśnienie oświadczenia majątkowego iOS

Jest to dwuczęściowe pytanie w nadziei, że mogę zrozumieć więcej na ten temat.

1) wydaje mi się, że masz dwie popularne opcje deklarowania właściwości dla klasy w objective c. Jednym z nich jest dodanie właściwości do ciała klasy nagłówka np.

@interface MyClass : NSObject {
    NSArray *myArray;
}

Lub możesz dodać go po @interface body i przed @end statement like so.

@interface MyClass : NSObject {
    //
}

@property (nonatomic, retain) NSArray *myArray;

Jaka jest różnica między tymi dwoma "stylami" a kiedy wybierasz jeden nad drugim?

2) Po @property znajdziesz opcje takie jak (nonatomic, retain). Do czego służą i dlaczego / kiedy używasz różnych opcji?

Author: nevan king, 2012-02-06

5 answers

Oto jedyne modyfikatory właściwości, które Xcode rozpoznaje:

  • nonatomic (nie egzekwuje bezpieczeństwa wątku na własności, głównie do użytku, gdy tylko jeden wątek ma być używany w całym programie)
  • atomic (wymusza bezpieczeństwo wątków na właściwości, głównie do użytku, gdy wiele wątków ma być używanych w całym programie) (domyślnie)
  • retain / strong (automatycznie zachowuje / zwalnia wartości na ustawieniu, upewnia się, że wartości nie dealokują się nieoczekiwanie) (domyślnie, jeśli ARC and object type)
  • readonly (nie można ustawić właściwości)
  • readwrite (można ustawić i pobrać właściwość) (domyślnie)
  • assign / unsafe_unretained (z tą właściwością nie można zarządzać pamięcią, jest ona obsługiwana ręcznie przez osobę przypisującą wartość) (domyślnie, jeśli nie typu ARC lub object)
  • copy (kopiuje obiekt przed jego ustawieniem, w przypadkach, gdy ustawiona wartość nie może ulec zmianie ze względu na czynniki zewnętrzne (łańcuchy, tablice, itd.).
  • weak (automatycznie zeruje Referencja powinna być dealokowana i nie zachowuje wartości przekazanej w)
  • getter=method (ustawia selektor używany do uzyskania wartości tej właściwości)
  • setter= method (Ustaw selektor używany do ustawiania wartości tej właściwości)
 48
Author: Richard J. Ross III,
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-02-06 16:03:37

1) @ property jest specjalnym sposobem definiowania metod getter - i setter - lub jak je nazywamy accessorami w Objective-C. Twój pierwszy urywek deklaruje tablicę, dla której musisz samodzielnie zadeklarować i zapisać accessory. Na przykład setMyArray: i myArray.
Użycie @ property zadeklaruje Twoje Accesory za Ciebie i jest równoważne zadeklarowaniu setMyArray: i myArray siebie. Jest to preferowany sposób deklarowania accesorów od Objective-C 2.0. Pamiętaj, że nadal musisz zadeklarować nieruchomość (w Twoim przypadku myArray).

2) najpierw musisz wiedzieć o @synthesize. Pamiętaj, że @property deklaruje accessory dla twojej nieruchomości, @synthesize je zaimplementuje. Gdy używasz właściwości @w interfejsie@, najprawdopodobniej piszesz @ synthesize w implementacji@. Użycie @ synthesize jest równoważne implementacji setMyArray: i myArray.
Atrybuty (nonatomic, retain) mówią kompilatorowi m.in., jak powinno działać zarządzanie pamięcią i w związku z tym, jak metody zostaną zaimplementowane. Zauważ, że nigdy nie widzisz tych akcesoriów, ale upewnij się, że są tam i są gotowe do użycia.

Aby przeczytać więcej na ten temat, polecam przeczytanie sekcji 9 na temat właściwości z poniższego tutoriala lub kupić książkę , która obejmuje Wprowadzenie do Objective-C.

Powinieneś również zapoznać się z co najmniej następującymi atrybutami:

  • dostęp
    • Wybierz readwrite (domyślnie) lub readonly. Jeśli readonly jest ustawione, to tylko dostępne będą metody getter.
  • Zarządzanie Pamięcią Settera
    • assign (domyślnie), po prostu przypisuje nową wartość. Najczęściej używasz tego tylko z prymitywnymi typami danych.
    • retain, uwalnia starą wartość i zachowuje nową. Jeśli używasz garbage collector, {[11] } jest równoważne assign. Dlaczego? Ręczne zwolnienie starej wartości zostanie wykonane przez garbage collector.
    • copy skopiuje nową wartość i zwolni starą. To jest często używany ze strunami.
  • Gwintowanie
    • atomic (domyślnie) zapewni, że metoda settera jest atomowa. Oznacza to, że tylko jeden wątek może uzyskać dostęp do settera jednocześnie.
    • nonatomic, użyj tego, gdy nie pracujesz z wątkami.

Ten post daje dobre wprowadzenie do zarządzania pamięcią i assign, retain i copy.

 29
Author: Simon,
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
2014-10-15 14:41:44

Właściwości są w zasadzie metodami dostępowymi. Określają zakres zmiennej. Pierwszy przypadek jak podano powyżej,zmienna nie jest dostępna w innych klasach, podczas gdy deklarując właściwość, tak jak w drugim przypadku, zmienna jest dostępna również w innych klasach. Są również przydatne do zarządzania pamięcią.

 2
Author: ajitesh,
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
2014-04-04 12:06:36

Pierwsza będzie deklaracją prywatną i nie będzie dostępna dla innych klas, jeśli nie zdefiniujesz drugiej. Drugi jest używany razem z @ synthesize in .moduł m i setter/getter są tworzone dla ciebie przez kompilator. Nadal możesz zdefiniować swój własny getter lub setter za pomocą tego. W tym przypadku wszystkie Ivary zdefiniowane w @ property mogą być dostępne przez inne klasy.Operacje zachowywania/zwalniania są wykonywane automatycznie. Aby uzyskać więcej informacji, przeczytaj dokumentację firmy Apple. proszę. sprawdź: Jaka jest różnica między atrybutami atomowymi i nieatomowymi?

 0
Author: Bora,
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
2017-05-23 12:22:41

Właściwości są w zasadzie metodami dostępowymi. Określają zakres zmiennej. domyślnie specyfikacją dostępu zmiennej jest protected , a właściwości ustawiają jej specyfikację z protected Na Public

 0
Author: Yogesh Kumar,
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
2014-10-31 04:54:56