2012-02-06 14 views
20

To jest dwuczęściowe pytanie w nadziei, że mogę zrozumieć więcej na ten temat.Wyjaśnienie deklaracji własności iOS

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

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

Albo można go dodać po organizmie @interface i przed stwierdzeniem @endPodobnie jak.

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

Jaka jest różnica między tymi dwoma „style” i kiedy wybrać jeden nad drugim?

2) po @property można znaleźć opcje, takie jak (nonatomic, retain). Co to jest i dlaczego używasz różnych opcji?/

Odpowiedz

47

Oto tylko modyfikatory właściwość, że Xcode rozpoznaje:

  • nonatomic (nie egzekwowania bezpieczeństwa wątku na nieruchomości, głównie do użycia, gdy tylko jeden wątek powinien być stosowany w programie)
  • atomic (wymusza bezpieczeństwa wątku na nieruchomości, głównie do użytku, gdy wiele wątków będzie używane w całym programie) (domyślnie)
  • retain/strong (automatycznie zachowuje/komunikaty wartości, na planie, dba o wartości nie niespodziewanie deallocate) (domyślnie jeśli ARC i rodzaj obiektu)
  • readonly (nie można ustawić właściwość)
  • readwrite (można zarówno zestaw i uzyskać własność) (domyślnie)
  • assign/unsafe_unretained (nie zarządzanie pamięcią powinny być wykonane z tej nieruchomości, to jest obsługiwane ręcznie przez osobę przypisanie wartości) (domyślnie jeśli nie ARC lub typ obiektu)
  • copy (kopiuje obiekt przed ustawieniem go w przypadki, w których ustawiona wartość nie może się zmienić ze względu na czynniki zewnętrzne (łańcuchy, tablice itp.).
  • weak (automatycznie zeruje odwołanie powinno przedmiot być zwalniane, a nie zachowuje wartości przekazanej w)
  • getter=method (ustawia selektor używany do uzyskania wartość tego mienia)
  • setter= method (ustaw selektor używany do ustawiania wartości tej właściwości)
+3

Ta jedyna odpowiedź to część 2 pytania. Odpowiedź Simona omawia część 1. –

+0

@MarkAmery oczywiście - czułem, że część pierwsza była naprawdę podstawowa, a inne odpowiedzi obejmowały to, gdy odpowiadałem. Nie musisz tutaj dodawać duplikatów. –

+1

# 2 jest całkowicie niepoprawny. właściwości "atomowe" * nie * zapewniają bezpieczeństwo wątków; raczej zapewnia atomowość. Jeśli zarówno wątek A, jak i wątek B są pisane, 'atomowy' zapewnia, że ​​wynik będzie całkowitą wartością, oznaczającą jeden lub drugi. Która z nich jest niezdefiniowana. Pisanie kodu bezpiecznego dla wątków nie jest tak proste, jak użycie właściwości 'atomowych'. Zobacz sekcję "Synchronizacja" w przewodniku po wątkach: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 –

0

Pierwsza z nich będzie prywatną deklaracją i nie będzie dostępna dla innych klas, jeśli nie zdefiniujesz drugiej. Drugi jest używany razem z @synthesize w module .m, a setter/getter są tworzone dla ciebie przez kompilator. W ten sposób możesz jeszcze zdefiniować własnego gettera lub setera. W tym przypadku wszystkie klasy iVar zdefiniowane w @property mogą być dostępne przez inne klasy. Operacje pobierania/zwolnienia są wykonywane automatycznie. Powinieneś przeczytać dokumentację Apple, aby uzyskać więcej informacji. proszę sprawdzić: What's the difference between the atomic and nonatomic attributes?

28

1) @property to specjalny sposób definiowania metod getter i setter lub, jak je nazywamy, akcesorów w Objective-C. Twój pierwszy fragment po prostu deklaruje tablicę, do której musisz sam zadeklarować i napisać dostęp. Na przykład: setMyArray: i myArray.
Korzystanie z @property spowoduje zadeklarowanie swoich akcesorów i jest równoznaczne z zadeklarowaniem setMyArray: i myArray. Jest to preferowany sposób deklarowania akcesorów od Objective-C 2.0. Pamiętaj, że musisz jeszcze zadeklarować własność (w twoim przypadku myArray).

2) Najpierw musisz wiedzieć o @synthesize. Pamiętaj, że @property DEKLARUJE akcesorów dla twojej własności, @synthesize je WDRAŻA. Kiedy używasz @property w twoim @interface, najprawdopodobniej napiszesz @synthesize w @implementation. Używanie @synthesize jest równoważne implementacji setMyArray: i myArray.
Atrybuty (nonatomic, retain) mówią kompilatorowi, między innymi, jak powinno działać zarządzanie pamięcią, a więc w jaki sposób zostaną zaimplementowane metody. Zauważ, że nigdy nie widzisz tych akcesorów, ale bądź pewny, że są tam i są gotowe do użycia.

Aby dowiedzieć się więcej na ten temat, przeczytaj sekcję 9 na temat właściwości z następującej Tutorial lub kup Book, która obejmuje wprowadzenie do Objective-C.

Ponadto należy zapoznać się z co najmniej następujących cech:

  • Dostęp
    • Wybierz readwrite (domyślnie) lub readonly. Jeśli ustawione jest readonly, TYLKO metody getter będą dostępne.
  • Seter Memory Management
    • assign (domyślnie), po prostu przypisuje nową wartość. Najczęściej używasz tego tylko z pierwotnymi typami danych.
    • retain, zwalnia starą wartość i zachowuje nową. Jeśli używasz śmieciarza, retain jest odpowiednikiem assign. Czemu? Ręczne zwolnienie starej wartości zostanie wykonane przez garbage collector.
    • copy spowoduje skopiowanie nowej wartości i zwolnienie starej wartości. Jest to często używane z ciągami.
  • Threading
    • atomic (domyślnie) zapewni, że metoda ustawiająca jest atomowy. Oznacza to, że tylko jeden wątek może uzyskać dostęp do settera na raz.
    • nonatomic, użyj tego, gdy nie pracujesz z wątkami.

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

+0

@Jackson, czy mogę prosić o zaakceptowanie mojej odpowiedzi? Jeśli to nie do przyjęcia, daj mi znać, co mogę zrobić, aby moja odpowiedź była lepsza. Naprawdę doceniam reputację, którą zdobędę, dzięki! – Simon

+2

Hej, bud, szczerze mówiąc Myślę, że "Richard J. Ross III" miał bardziej * zwięzłą * odpowiedź dla nie-czytelnika, jak ja. Jednak postawiłem cię jako +1, ponieważ oczywiście wkładasz * dużo wysiłku * w swoją odpowiedź. Ponadto, widzę * koncepcję biznesową *, pytając, dlaczego nie zaakceptowałem Twojej odpowiedzi, ale uważam, że jest to "* odstraszanie" *, aby poprosić kogoś o zaakceptowanie twojej odpowiedzi. Jestem pewien, że każdy jest * inny * w odniesieniu do tego tematu. W każdym razie jest mój dwusegment. – Jacksonkr

2

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ść jak w drugim przypadku zmienna jest dostępna także w innych klasach. Są również przydatne do zarządzania pamięcią.

+0

Zmienną instancji można udostępnić innym klasom, deklarując je jako "@ public". – newacct

0

Właściwości są zasadniczo metodami dostępowymi. Określają zakres zmiennej. domyślnie dostęp do specyfikacji zmiennej to chroniony, a właściwości ustawiają jej Specyfikator z chroniony na Publiczny