Różnice między silnymi i słabymi w Objective-C

Jestem nowy w Obj-C, więc moje pierwsze pytanie brzmi:

Jakie są różnice pomiędzy strong i weak w @property deklaracjach wskaźników do obiektów?

Co to znaczy?
 289
Author: nhgrif, 2012-06-13

8 answers

Silne odniesienie (które będzie używane w większości przypadków) oznacza, że chcesz "posiadać" obiekt, do którego się odwołujesz z tą właściwością/zmienną. Kompilator zadba o to, aby każdy obiekt przypisany do tej właściwości nie został zniszczony, o ile wskażesz na niego silne odniesienie. Tylko po ustawieniu właściwości na nil obiekt zostanie zniszczony (chyba że jeden lub więcej innych obiektów również zawiera silne odniesienie do niego).

W przeciwieństwie, ze słabym odniesieniem ty oznacza to, że nie chcesz mieć kontroli nad żywotnością obiektu. Obiekt, do którego się odnosisz, żyje tylko dlatego, że przynajmniej jeden inny obiekt ma do niego silne odniesienie. Gdy tak się nie stanie, obiekt zostanie zniszczony, a twoja słaba własność zostanie automatycznie ustawiona na nil. Najczęstsze przypadki użycia słabych odniesień w iOS to:

  1. Właściwości Delegate, które często są słabo odwoływane, aby uniknąć zatrzymywania cykli, i

  2. Podglądy / kontrolki głównego widoku kontrolera widoku, ponieważ widoki te są już mocno utrzymywane przez główny widok.

Atomic vs. nonatomic odnosi się do bezpieczeństwa wątku metod getter i setter, które kompilator syntetyzuje dla właściwości. atomic (domyślnie) mówi kompilatorowi, aby metody accessora były bezpieczne (dodając blokadę przed dostępem do ivar) , a nonatomic robi odwrotnie. Zaleta nieatomowa jest nieco wyższa wydajność. W systemie iOS Apple używa niematomicznych dla prawie wszystkich swoich właściwości, więc ogólna rada jest dla Ciebie, abyś zrobił to samo.

 617
Author: Ole Begemann,
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
2016-04-02 09:47:59

Pomocne może być myślenie o silnych i słabych odniesieniach w kategoriach balonów.

Balon nie odleci tak długo, jak przynajmniej jedna osoba będzie trzymała się przywiązanego do niego Sznurka. Liczba osób trzymających sznurki jest liczbą zatrzymanych. Gdy nikt nie trzyma Sznurka, balon odleci (dealloc). Wiele osób może mieć sznurki do tego samego balonu. Na obiekcie odniesienia można uzyskać/ustawić właściwości i metody wywołania zarówno silne, jak i słabe referencje.

Mocne odniesienie jest jak trzymanie sznurka do tego balonu. Dopóki trzymasz sznurek przymocowany do balonu, nie odleci.

Słabe odniesienie jest jak patrzenie na balon. Możesz go zobaczyć, uzyskać dostęp do jego właściwości, wywołać jego metody, ale nie masz ciągu do tego balonu. Jeśli wszyscy trzymający się Sznurka puszczą, balon odleci, a ty nie masz już do niego dostępu.

 658
Author: MJN,
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
2015-07-27 16:59:55

Strong : przypisuje mu przychodzącą wartość, zachowa przychodzącą wartość i zwolni istniejącą wartość zmiennej instancji

Weak : przypisze do niego przychodzącą wartość bez zatrzymywania jej.

Więc podstawową różnicą jest zachowanie nowej zmiennej. Generalnie chcesz go zachować, ale są sytuacje, w których nie chcesz go mieć, w przeciwnym razie otrzymasz cykl zachowywania i nie możesz uwolnić pamięci obiektów. Np. obj1 zachowuje obj2 a obj2 zachowuje obj1. Aby rozwiązać ten rodzaj sytuacji, używasz słabych odniesień.

 21
Author: Pfitz,
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-06-13 11:14:26

A dummy answer :-

Myślę, że wyjaśnienie jest podane w powyższej odpowiedzi, więc powiem Ci tylko, gdzie użyć STRONG i gdzie korzystać WEAK :

Użycie Weak :- 1. Delegaci 2. Outlety 3. Subviews 4. Sterowanie itp.

Użycie Strong :- Pozostając wszędzie, co nie jest zawarte w WEAK.

 12
Author: shubham mishra,
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
2016-10-05 06:42:19

Silne i słabe , te słowa kluczowe obracają się wokół własności obiektu w Objective-C

Czym jest własność obiektu ?

Zmienne wskaźnikowe oznaczają własność obiektów, do których wskazują.

  • gdy metoda (lub funkcja) ma zmienną lokalną, która wskazuje na obiekt, mówi się, że ta zmienna jest właścicielem wskazywanego obiektu.
  • gdy obiekt ma zmienną instancji, która wskazuje na inny obiekt, obiekt z mówi się, że wskaźnik jest właścicielem wskazywanego obiektu.

Za każdym razem, gdy zmienna wskaźnika wskazuje na obiekt, obiekt ten ma właściciela i pozostanie przy życiu. Jest to znane jako Silne odniesienie.

Zmienna może opcjonalnie nie przejąć własności obiektu, na który wskazuje. Zmienna, która nie przejmuje własności obiektu jest znana jako odniesienie słabe.

Poszukaj tutaj szczegółowego wyjaśnienia Demystifying @ property and atrybuty

 8
Author: Vinay Jain,
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-04-05 12:30:06

Tutaj Dokumentacja Apple wyjaśniła różnicę między słabą a silną właściwością na różnych przykładach:

Https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3{[6]

Tutaj, w tym blogu autor zebrał wszystkie właściwości w tym samym miejscu. Pomoże to porównać cechy właściwości :

Http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

 6
Author: subhash kumar singh,
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-08-20 20:22:11

Strong jest wartością domyślną. Obiekt pozostaje "żywy" tak długo, jak długo istnieje silny wskaźnik do niego.

Weak określa odniesienie, które nie utrzymuje obiektu odniesienia przy życiu. Słabe odniesienie jest ustawiane na nil, gdy nie ma silnych odniesień do obiektu.

 6
Author: Ankit Vyas,
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-09-02 14:28:39

Strong : zasadniczo używany z właściwościami, których użyliśmy do pobierania lub wysyłania danych z / do innych klas. słabe : zazwyczaj wszystkie gniazda, połączenia są słabego typu z interfejsu.

Nonatomic: tego typu właściwości są używane w warunkach, gdy nie chcemy dzielić naszego gniazdka lub obiektu na różne jednoczesne wątki. Innymi słowy, instancja Nieatomowa sprawia, że nasze właściwości radzą sobie z jednym wątkiem na raz. Mam nadzieję, że to ci pomoże.

 1
Author: Joga singh,
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-01-23 11:11:21