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?
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)
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) lubreadonly
. Jeślireadonly
jest ustawione, to tylko dostępne będą metody getter.
- Wybierz
- 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żneassign
. 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
.
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ą.
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?
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
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