Objective - C ARC: strong vs retain and weak vs assign

Istnieją dwa nowe atrybuty zarządzania pamięcią dla właściwości wprowadzonych przez ARC, strong i weak.

Poza copy, które jest oczywiście czymś zupełnie innym, czy są jakieś różnice między strong vs retain i weak vs assign?

Z mojego zrozumienia, jedyną różnicą jest to, że weak przypisze nil do wskaźnika, podczas gdy assign nie, co oznacza, że program zawiesi się, gdy wyślę wiadomość do wskaźnika po jego zwolnieniu. Ale jeśli użyję weak, to się nigdy nie stanie, ponieważ Wiadomość wysłana do nil nic nie da.

Nie wiem o żadnych różnicach między strong i retain.

Czy Jest jakiś powód, dla którego powinienem używać assign i retain w nowych projektach, czy są one przestarzałe?

Author: swiftBoy, 2012-01-19

8 answers

From the Transitioning to Arc Release Notes (przykład w sekcji o atrybutach właściwości).

// The following declaration is a synonym for: @property(retain) MyClass *myObject;

@property(strong) MyClass *myObject;

Więc strong jest tym samym co retain w oświadczeniu majątkowym.

Dla projektów ARC użyłbym strong zamiast retain, użyłbym assign dla prymitywnych właściwości C i weak dla słabych odniesień do obiektów Objective-C.

 226
Author: JeremyP,
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-01-25 22:50:23

Po przeczytaniu tak wielu artykułów postów Stackoverflow i aplikacji demonstracyjnych do sprawdzania atrybutów właściwości zmiennych, postanowiłem złożyć wszystkie informacje o atrybutach razem:

  1. atomic / / default
  2. nieatomowe
  3. strong = retain / / default
  4. słaby
  5. assign / / default
  6. unsafe_unreted
  7. Kopia
  8. readonly
  9. readwrite / / default

Poniżej znajduje się szczegółowy artykuł link gdzie można znaleźć wyżej wymienione wszystkie atrybuty, które na pewno ci pomogą. Wielkie dzięki dla wszystkich ludzi, którzy dają najlepsze odpowiedzi tutaj!!

Atrybuty właściwości zmiennych lub modyfikatory w systemie iOS

1.strong (iOS4 = retain)

  • mówi "trzymaj to w kupie, dopóki nie wskażę na to więcej"
  • innymi słowy " jestem właścicielem, nie można dealloc tego przed aim dobrze z tym samym, co zachować "
  • używasz Stronga tylko wtedy, gdy musisz zachować obiekt.
  • domyślnie wszystkie zmienne instancji i zmienne lokalne są silnymi wskaźnikami.
  • Zazwyczaj używamy strong dla UIViewControllers (UI item ' s parents)
  • strong jest używany z ARC i zasadniczo pomaga, nie martwiąc się o liczbę zatrzymanych przedmiotów. ARC automatycznie zwalnia go dla ciebie, gdy skończysz z nim.Użycie słowa kluczowego strong oznacza, że posiadasz obiekt.

Przykład:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

2.słabe -

  • jest napisane "trzymaj to tak długo, jak ktoś mocno na to wskazuje"
  • to samo co przypisać, Nie zachować lub zwolnić
  • "słabe" odniesienie jest odniesieniem, którego nie zachowujesz.
  • Zazwyczaj używamy słabych dla Iboutletów (UIViewController ' s Childs).Działa to, ponieważ obiekt potomny musi istnieć tylko tak długo, jak obiekt nadrzędny.
  • słabe odniesienie to odniesienie, które nie chroni obiektu odniesienia przed zbieraniem przez garbage collector.
  • słaby jest zasadniczo przypisaniem, nieruchomością nieuregulowaną. Z wyjątkiem sytuacji, gdy obiekt jest dealokowany, słaby wskaźnik jest automatycznie ustawiany na nil

Przykład:

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Mocne i słabe Wyjaśnienie, dzięki BJ Homer:

Wyobraź sobie, że naszym obiektem jest pies i że pies chce uciec (być deallocated).

Mocne wskazówki są jak smycz na pies. Tak długo, jak masz smycz przymocowana do psa, pies nie ucieknie. Jeśli pięć osób przymocować smycz do jednego psa, (pięć mocnych wskazówek do jednego przedmiotu), wtedy pies nie ucieknie, dopóki wszystkie pięć smyczy nie zostanie odłączonych.

Słabe punkty, z drugiej strony, są jak małe dzieci wskazujące na pies i mówi: Pies!"Dopóki pies jest jeszcze na smycz, małe dzieci nadal widzą psa, i nadal będą wskazywać za to. Jak tylko wszystkie smycze są odpinane, jednak pies biegnie bez względu na to, ile małych dzieci na to wskazuje.

Gdy tylko ostatni silny wskaźnik (smycz) nie wskazuje już na obiekt, obiekt zostanie dealokowany, a wszystkie słabe wskaźniki będą / align = "left" /

Kiedy używamy słabego?

Tylko wtedy, gdy chcesz użyć słabego, to jeśli chcesz uniknąć zatrzymywania cykli (np. rodzic zatrzymuje dziecko, a dziecko zatrzymuje rodzica, więc nigdy nie jest wydany).

3.retain = strong

  • zostanie zachowana, zostanie zwolniona Stara wartość i zostanie jej przypisana retain określa, że nowa wartość powinna zostać wysłana
  • zachowaj przy przypisaniu i starą wartość sent-release
  • zachowywanie jest takie samo jak silne.
  • apple mówi, że jeśli napiszesz zachowaj to będzie auto konwertowane / działa jak strong tylko.
  • metody takie jak "alloc" zawierają implicit "retain"

Przykład:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.assign

  • przypisanie jest domyślne i po prostu wykonuje przypisanie zmiennej
  • Assign jest atrybutem właściwości, który mówi kompilatorowi, jak zsyntetyzować implementację settera właściwości.]}
  • użyłbym assign dla prymitywnych właściwości C, a weak dla słabych odniesień do obiektów Objective-C.

Przykład:

@property (nonatomic, assign) NSString *address;

@synthesize address;
 584
Author: swiftBoy,
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:26:17

Z tego co wiem, strong i retain są synonimami, więc robiądokładnie to samo.

Wtedy weak jest prawie jak assign, ale automatycznie ustawia się na nil po tym, jak obiekt, do którego wskazuje, jest dealokowany.

Oznacza to, że można je po prostu zastąpić.

Jednak, jest jeden szczególny przypadek, w którym musiałem użyć assign, a nie weak. Załóżmy, że mamy dwie właściwości delegateAssign i delegateWeak. W obu jest przechowywany nasz delegat, czyli posiadanie nas przez posiadanie jedynego mocnego odniesienia. Delegat jest dealokujący, więc nasza metoda -dealloc jest również wywoływana.

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}

Delegat jest już w procesie dealokacji, ale nadal nie jest w pełni dealokowany. Problem w tym, że weak odniesienia do niego są już unieważnione! właściwość delegateWeak zawiera nil, ale delegateAssign zawiera poprawny obiekt (ze wszystkimi właściwościami już zwolnionymi i unieważnionymi, ale wciąż ważnymi).

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.
}

Jest to dość szczególny przypadek, ale to ujawnij nam, jak działają te zmienne weak i kiedy są anulowane.

 38
Author: Tricertops,
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-01-27 09:47:17

Nieatomowe / atomowe

  • nonatomic jest znacznie szybszy niż atomic
  • Zawsze używaj nonatomic, chyba że masz bardzo specyficzne wymagania dla atomic, które powinny być rzadkie (atomic nie gwarantuje bezpieczeństwa wątku - tylko blokuje dostęp do właściwości, gdy jest jednocześnie ustawiany przez inny wątek)

Strong/weak / assign

  • użyj strong , Aby zachować obiekty - chociaż słowo kluczowe zachowaj jest synonimem, najlepiej jest użyć strong zamiast
  • użyj słaby jeśli chcesz tylko wskaźnik do obiektu bez zatrzymywania go-przydatne do unikania cykli zatrzymywania (np. delegatów) - automatycznie zeruje wskaźnik po zwolnieniu obiektu
  • use assign for primatives-exactly like weak except it doesn ' t nil out the object when released (set by default)

(Opcjonalnie)

Kopia

  • Użyj go do tworzenia płytkiej kopii obiektu
  • dobrze praktyka ustawiania niezmiennych właściwości na copy - ponieważ zmienne wersje mogą być przekazywane do niezmiennych właściwości, copy zapewni, że zawsze będziesz miał do czynienia z niezmiennym obiektem
  • jeśli przekazany zostanie obiekt niezmienny, zachowa go - jeśli przekazany zostanie obiekt zmienny, skopiuje go

Readonly

  • Użyj go, aby wyłączyć ustawienie właściwości (zapobiega kompilacji kodu w przypadku naruszenia)
  • możesz zmienić to, co jest Getter jest dostarczany poprzez zmianę zmiennej bezpośrednio poprzez jej zmienną instancyjną lub wewnątrz samej metody getter
 36
Author: Vadoff,
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-09-15 00:25:32

Dokument clanga o Objective - C Automatic Reference Counting (ARC) jasno wyjaśnia kwalifikatory własności i modyfikatory:

Istnieją cztery kwalifikatory własności:

  • __autoreleasing
  • __strong
  • _ _ * unsafe_unreted*
  • __słabe

Typ jest nietrywialnie kwalifikowany, jeśli jest kwalifikowany z __ autoreleasing, __mocna , lub __ słaby .

Wtedy istnieje sześć modyfikatorów własności deklarowanej Nieruchomości:

  • assign implikuje __*unsafe_unreted* własność.
  • Kopia implikuje __silną własność , jak również zwykłe zachowanie semantyki kopiowania na seterze.
  • zachowaj implikuje _ _ silną własność.
  • silna implikuje __silna własność.
  • *unsafe_unreted* implikuje _ _ *unsafe_unreted* własność.
  • słaba implikuje __słaba własność.

Z wyjątkiem słabego modyfikatory te są dostępne w trybach innych niż ARC.

Semantyka kwalifikatory własności mają inne znaczenie w pięciu zarządzanych operacjach : odczytywanie, Przypisywanie, Inicjalizacja, niszczenie i przenoszenie, w których najczęściej zależy nam tylko na różnicy w operacji przypisywania.

Przypisanie występuje podczas oceny operatora przypisania. Na semantyka różni się w zależności od kwalifikacji:

  • dla obiektów _ _ strong , nowy punkt jest najpierw zachowywany; drugi, lvalue jest ładowany prymitywnymi semantykami; trzeci, nowy punkt jest przechowywany w lvalue z prymitywną semantyką; i wreszcie, stary punkt jest uwalniany. Nie jest to wykonywane atomicznie; należy użyć synchronizacji zewnętrznej, aby było to bezpieczne w twarz współbieżnych ładunków i magazynów.
  • dla _ _ słabych obiektów, lvalue jest aktualizowany tak, aby wskazywał na nowy punkt, chyba że nowy punkt jest obiektem poddawanym dealokacji, w którym to przypadku lvalue jest aktualizowany do wskaźnika null. Musi to być wykonywane atomicznie w odniesieniu do innych przypisań do obiektu, do odczytu z obiektu i do ostatecznego wydania nowego punktu.
  • dla obiektów _ _ * unsafe_unreted * nowy punkt jest przechowywany w lvalue używając prymitywnej semantyki.
  • dla obiektów _ _ autoreleasing nowy punkt jest zachowywany, autoreleasingowany i przechowywany w lvalue przy użyciu prymitywnej semantyki.

Druga różnica w czytaniu, Init, niszczeniu i przenoszeniu, znajduje się w sekcja 4.2 semantyka w dokumencie.

 20
Author: Mingming,
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-10-22 09:20:50

Mocny:

  • właściwość nie zniszczy, ale tylko po ustawieniu właściwości na nil obiekt zostanie zniszczony
  • domyślnie wszystkie zmienne instancji i zmienne lokalne są silnymi wskaźnikami.
  • używasz Stronga tylko wtedy, gdy musisz zachować obiekt.
  • Zazwyczaj używamy strong dla UIViewControllers (UI item ' s parents)
  • IOS 4 (non-ARC) możemy użyć słowa kluczowego Zachowaj
  • IOS 5 (ARC) możemy użyć silnego słowa kluczowego

Przykład: @ property (strong, nonatomic) ViewController *viewController;

@ synthesize viewController;

Słaby

Domyślnie automatycznie pobiera i ustawia na nil

  • Zazwyczaj używamy słabych dla Iboutlets (UIViewController ' s Childs) i delegate
  • to samo co assign, no retain or release

Przykład : @property (weak, nonatomic) Iboutlet UIButton *myButton;

@ synthesize myButton;

 2
Author: Nikunj Patel,
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-26 07:41:49

Różnice między mocnym a zachowawczym:

  • w iOS4 mocna jest równa zatrzymaniu
  • oznacza to, że posiadasz obiekt i trzymasz go w kupie, dopóki nie wskażesz go więcej
  • jeśli napiszesz zachowaj to będzie działać automatycznie tak jak strong

Różnice między słabym a przypisanym:

  • "Słabe" odniesienie to odniesienie, którego nie zachowujesz i zachowujesz je tak długo, jak ktoś mocno na nie wskazuje
  • Kiedy obiekt jest "dealokowany", słaby wskaźnik jest automatycznie ustawiany na nil
  • atrybut właściwości "assign" mówi kompilatorowi, jak zsyntetyzować implementację settera właściwości
 1
Author: Chen Rui,
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-04-26 06:54:03

strong, weak, assign atrybuty właściwości określają sposób zarządzania pamięcią dla tej właściwości.

Strong oznacza, że liczba referencji zostanie zwiększona i odniesienie do niego będzie utrzymywane przez życie obiektu

Weak (non-strong reference ), oznacza, że wskazujemy na obiekt, ale nie zwiększamy jego liczby referencji. Jest często używany podczas tworzenia relacji rodzic-dziecko. Rodzic ma silne odniesienie do dziecka, ale dziecko ma tylko słabe odniesienie do rodzica.

Za każdym razem używane na var.
Za każdym razem używany na opcjonalnym typie.
Automatycznie zmienia się na nil.

Tylko do odczytu , możemy wstępnie ustawić właściwość, ale wtedy nie można jej zmienić.

Copy , oznacza, że kopiujemy wartość obiektu podczas jego tworzenia. Zapobiega również zmianie jego wartości.

 -1
Author: Rein rPavi,
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-07-09 13:03:42