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

308

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

Jakie są różnice w deklaracjach wskaźników do obiektów strongiw deklaracjach?weak@property

Co też nonatomicznaczy?

Mark Pegasov
źródło
19
właściwie to dobre pytania, czasem zapominamy, jak podstawowa koncepcja silnych / słabych i atomowych / nieatomowych preferencji .... :) Dziękujemy za przypomnienie nam o tym ...
andikurnia
10
@JackyBoy Co zabawne, że proponowane proste wyszukiwanie w google doprowadziło mnie tutaj, lol. #circularreference
Jason Renaldo
10
Zwykle nie ufam wielu odpowiedziom w Google, ale zawsze
odnoszę

Odpowiedzi:

641

Silne odwołanie (którego będziesz używać w większości przypadków) oznacza, że ​​chcesz „posiadać” obiekt, do którego się odwołujesz za pomocą tej właściwości / zmiennej. Kompilator zadba o to, aby jakikolwiek obiekt przypisany do tej właściwości nie został zniszczony, o ile wskażesz na nią silne odniesienie. Tylko wtedy, gdy ustawisz właściwość na nil, obiekt zostanie zniszczony (chyba że jeden lub więcej innych obiektów również zawiera silne odniesienie do niego).

Natomiast przy słabym odwołaniu oznaczasz, że nie chcesz mieć kontroli nad czasem życia obiektu. Obiekt, do którego się odwołujesz słabo, żyje tylko dlatego, że co najmniej jeden inny obiekt ma do niego silne odniesienie. Gdy już tak się nie stanie, obiekt zostanie zniszczony, a twoja słaba właściwość zostanie automatycznie ustawiona na nil. Najczęstsze przypadki użycia słabych referencji w iOS to:

  1. delegować właściwości, do których często odwołuje się słabo, aby uniknąć zachowywania cykli, oraz

  2. widoki podrzędne / kontrolne głównego widoku kontrolera widoków, ponieważ te widoki są już mocno trzymane przez główny widok.

atomowy vs. nieatomowy odnosi się do bezpieczeństwa wątków metod pobierających i ustawiających, które kompilator syntetyzuje dla właściwości. atomic (domyślnie) mówi kompilatorowi, aby uczynił metody dostępowe bezpiecznymi dla wątków (dodając blokadę przed uzyskaniem dostępu do ivar), a nonatomic robi odwrotnie. Zaletą nonatomic jest nieco wyższa wydajność. W systemie iOS Apple używa nonatomic do prawie wszystkich swoich właściwości, więc ogólna rada jest taka sama.

Ole Begemann
źródło
28
@Bourne: To zależy od tego, co rozumiesz przez bezpieczeństwo wątków. atomicgwarantuje, że właściwość może być bezpiecznie odczytywana i zapisywana z kilku wątków jednocześnie. Nie oznacza to, że obiekt, którego wszystkie właściwości są wszystkie, atomicautomatycznie zabezpieczony przed wątkami.
Ole Begemann
3
Świetne szczegóły. Myślę, że do tej pory tak naprawdę go nie rozumiałem. Dziękuję Ci.
ahmedalkaff,
1
Zgodnie z dokumentacją Apple, atomowa i nieatomowa powinna być synonimem bezpieczeństwa wątków. developer.apple.com/library/ios/documentation/cocoa/conceptual/…
Murtaza Khursheed Hussain 24.09.2013
5
„Uwaga: atomowość właściwości nie jest synonimem bezpieczeństwa wątku obiektu.” developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS
dlaczego nie usuniemy tego wystąpienia, gdy nie chcemy? Dlaczego nie możemy po prostu wyjąć powietrza z balonu lub zniszczyć go, gdy nie chcemy, dlaczego musimy dbać o przymocowane sznurki? Potrzebujemy tylko danych.
Ashish Pisey
706

Pomocne może być przemyślenie silnych i słabych referencji w kategoriach balonów.

Balon nie odleci, dopóki przynajmniej jedna osoba będzie trzymała przymocowany do niego sznurek. Liczba osób posiadających ciągi to liczba zatrzymań. Gdy nikt nie trzyma się sznurka, balon odleci (dealloc). Wiele osób może mieć sznurki do tego samego balonu. Możesz uzyskać / ustawić właściwości i metody wywoływania obiektu, do którego istnieje odwołanie, zarówno z silnymi, jak i słabymi referencjami.

Silne odniesienie przypomina trzymanie sznurka do tego balonu. Tak długo, jak trzymasz sznur przymocowany do balonu, nie odleci.

Słabe odniesienie przypomina patrzenie na balon. Możesz to zobaczyć, uzyskać dostęp do jego właściwości, nazwać to metodami, ale nie masz łańcucha do tego balonu. Jeśli wszyscy trzymający sznurek puszczają, balon odlatuje i nie możesz już do niego uzyskać dostępu.

MJN
źródło
68
+2 (gdybym tylko mógł). Poważnie, naprawdę twórcze wyjaśnienie!
Con Antonakos,
25
Po półtora roku rozwoju iOS, myślę, że właśnie teraz zrozumiałem, co strongi weakwłaściwie mam na myśli.
Isuru
17
@ X.Li Zachowaj cykl przypomina, że ​​masz 2 struny do balonu, jeden z nich jest twoją własnością (więc jesteś właścicielem tego balonu), drugi jest własnością balonu (więc ten balon jest twoim właścicielem). Skoro masz dostęp tylko do swojego sznurka, w jaki sposób puścić balon, jeśli balon nie chce iść? Lepiej więc, żebyś posiadał balon (mocny), podczas gdy balon nie posiadał ciebie (słaby). Kiedy chcesz odpuścić, po prostu odetnij sznurek :)
snakeninny
5
Przeczytaj jego profil, jest instruktorem iOS. Bardzo kreatywne wyjaśnienie !! Czapki z
głów
3
Atomowy kontra nieatomowy Myślę, że można opisać go jako publiczną toaletę z wieloma drzwiami, z jedną toaletą pośrodku. Gdy ktoś wejdzie do toalety jednymi drzwiami, równie dobrze może zamknąć wszystkie pozostałe drzwi do toalety, jeśli nie chce doświadczyć chwili niezręczności. Lol. Dziękujemy za przeczytanie tej nonsensownej analogii.
Chen Li Yong,
24

strong : przypisuje mu wartość wejściową, zachowa wartość wejściową i zwolni istniejącą wartość zmiennej instancji

słaby : przypisze mu wartość wejściową bez jej zachowania.

Tak więc podstawową różnicą jest zachowanie nowej zmiennej. Zasadniczo chcesz go zachować, ale są sytuacje, w których nie chcesz go mieć, w przeciwnym razie otrzymasz cykl przechowywania i nie możesz zwolnić pamięci obiektów. Na przykład. obj1 zachowuje obj2, a obj2 zachowuje obj1. Aby rozwiązać tego rodzaju sytuację, używasz słabych referencji.

Pfitz
źródło
12

Atrapa odpowiedzi: -

Myślę, że wyjaśnienie podano w powyższej odpowiedzi, więc powiem ci tylko, gdzie STRONGi gdzie użyć WEAK:

Zastosowanie Weak: - 1. Delegaci 2. Punkty 3. Podsłuchy 4. Kontrole itp.

Zastosowanie Strong: - Pozostając wszędzie, co nie jest objęte WEAK.

Shubham Mishra
źródło
2
A co zawiera etc: P
Rajneesh071
3
webView, mapView itp.
shubham mishra
4
właściwie większość subview, który przeciągamy i upuszczamy na scenorysie
Shubham Mishra,
8

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

Co to jest własność obiektu?

Zmienne wskaźnikowe sugerują własność obiektów, na które wskazują.

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

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

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

Sprawdź szczegółowe wyjaśnienie tutaj Demystifying @property i atrybuty

Vinay Jain
źródło
6

W dokumentacji Apple wyjaśniono różnicę między słabą a mocną własnością na podstawie różnych przykładów:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsicingData/EncapsicingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

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

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

Subhash Kumar Singh
źródło
6

silny jest domyślny. Obiekt pozostaje „żywy”, dopóki jest do niego silny wskaźnik.

słaby określa odwołanie, które nie utrzymuje obiektu, o którym mowa, przy życiu. Słabe odniesienie jest ustawione na zero, gdy nie ma silnych odniesień do obiektu.

Ankit Vyas
źródło
2

Aby zrozumieć silną i słabą referencję, rozważ poniższy przykład, załóżmy, że mamy metodę o nazwie displayLocalVariable.

 -(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
  }

W powyższej metodzie zakres zmiennej myView jest ograniczony do metody displayLocalVariable, po zakończeniu metody zmienna myView, która przechowuje obiekt UIView, zostanie zwolniona z pamięci.

Co teraz, jeśli chcemy zachować zmienną myView przez cały cykl życia naszego kontrolera widoku. W tym celu możemy utworzyć właściwość o nazwie usernameView, która będzie miała silne odniesienie do zmiennej myView (patrz @property(nonatomic,strong) UIView* usernameView;i self.usernameView = myView;poniżej kod), jak poniżej,

@interface LoginViewController ()

@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;

- (void)displayLocalVariable;

@end

@implementation LoginViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

}

-(void)viewWillAppear:(BOOL)animated
{
     [self displayLocalVariable];
}

- (void)displayLocalVariable
{
   UIView* myView = [[UIView alloc] init];
   NSLog(@"myView tag is = %ld", myView.tag);
   self.usernameView = myView;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


@end

Teraz w powyższym kodzie widać, że myView zostało przypisane do self.usernameView, a self.usernameView ma silne odniesienie (jak zadeklarowaliśmy w interfejsie za pomocą @property) do myView. Dlatego myView nie zostanie zwolniony z pamięci, dopóki self.usernameView nie będzie żył.

  • Słabe referencje

Zastanówmy się teraz nad przypisaniem myName do dummyNameView, które jest słabym odwołaniem, w self.dummyNameView = myView;przeciwieństwie do silnego odwołania Słaby będzie utrzymywał myView tylko do momentu, gdy będzie silne odwołanie do myView. Zobacz poniższy kod, aby zrozumieć Słabe referencje,

-(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
     self.dummyNameView = myView;
  }

W powyższym kodzie jest Słabe odniesienie do myView (tj. Self.dummyNameView ma Słabe odniesienie do myView), ale nie ma silnego odwołania do myView, dlatego self.dummyNameView nie będzie w stanie utrzymać wartości myView.

Teraz ponownie rozważ poniższy kod,

-(void)displayLocalVariable
      {
         UIView* myView = [[UIView alloc] init];
         NSLog(@"myView tag is = %ld", myView.tag);
         self.usernameView = myView;
         self.dummyNameView = myView;
      } 

W powyższym kodzie self.usernameView ma silne odwołanie do myView, dlatego self.dummyNameView będzie mieć teraz wartość myView nawet po zakończeniu metody, ponieważ myView ma silne odwołanie powiązane z tym.

Teraz za każdym razem, gdy odwołujemy się do zmiennej Strong, jej liczba zatrzymań jest zwiększana o jeden, a zmienna nie zostanie zwolniona, dopóki jej liczba zatrzymań nie osiągnie 0.

Mam nadzieję że to pomoże.

Mahadev Mandale
źródło
2019-07-25 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] Nazywam się = ABC 2019-07-25 12: 33: 15.479226 + 0530 StrongAndWeak [6329: 245483] Nazywam się strong = ABC 2019- 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [6329: 245483] Nazywam się słaby = ABC, w tym powiedziano ci, że słaba własność nie ma wartości mojam. ..? czy możesz podać bardziej jednoznaczną odpowiedź ... Z góry dziękuję
Madhu_Nani,
@Raviteja_DevObal ARC nie obiecuje, że zrobi to natychmiast (tj. Cofnie przydział ciągu @ „ABC”), ale na pewno później
zwolni
@Raviteja_DevObal Jak wyjaśnić tutaj, ciągi są złym tego przykładem. Zaktualizowałem swoją odpowiedź o obiekt UIView, mam nadzieję, że to pomoże.
Mahadev Mandale
1

Mocne : w zasadzie używane z właściwościami używaliśmy do pobierania lub wysyłania danych z / do innych klas. Słabe : Zazwyczaj wszystkie gniazda, połączenia są słabego typu z interfejsu.

Nieatomowe : Tego rodzaju właściwości są używane w warunkach, w których 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 było to dla ciebie pomocne.

Joga Singh
źródło