Jestem nowy w Obj-C, więc moje pierwsze pytanie brzmi:
Jakie są różnice w deklaracjach wskaźników do obiektów strong
iw deklaracjach?weak
@property
Co też nonatomic
znaczy?
Jestem nowy w Obj-C, więc moje pierwsze pytanie brzmi:
Jakie są różnice w deklaracjach wskaźników do obiektów strong
iw deklaracjach?weak
@property
Co też nonatomic
znaczy?
Odpowiedzi:
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:
delegować właściwości, do których często odwołuje się słabo, aby uniknąć zachowywania cykli, oraz
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.
atomic
gwarantuje, ż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, atomic
automatycznie zabezpieczony przed wątkami.
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.
strong
i weak
właściwie mam na myśli.
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.
Atrapa odpowiedzi: -
Myślę, że wyjaśnienie podano w powyższej odpowiedzi, więc powiem ci tylko, gdzie STRONG
i 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
.
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ą.
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
W dokumentacji Apple wyjaśniono różnicę między słabą a mocną własnością na podstawie różnych przykładów:
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
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.
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ł.
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.
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.