Jako ktoś, kto jest nowy w Celu C, może ktoś dać mi przegląd zachowania, przypisania, kopiowania i wszystkich innych, których mi brakuje, które są zgodne z dyrektywą @property? Co oni robią i dlaczego miałbym chcieć używać jednego nad drugim?
ios
objective-c
iphone
memory-management
Mark Reid
źródło
źródło
Odpowiedzi:
Artykuł powiązany z MrMage już nie działa. Oto, czego nauczyłem się w moim (bardzo) krótkim czasie kodowania w Objective-C:
nonatomic vs. atomic - domyślnym jest „atomic”. Zawsze używaj „nieatomowych”. Nie wiem dlaczego, ale w książce, którą czytałem, jest „rzadko kiedy jest powód”, by używać „atomu”. (BTW: Przeczytałem książkę BNR „Programowanie na iOS”.)
readwrite vs. readonly - „readwrite” jest ustawieniem domyślnym. Kiedy @synthesize zostanie utworzony zarówno getter, jak i setter. Jeśli użyjesz opcji „tylko do odczytu”, nie zostanie utworzony program ustawiający. Użyj go dla wartości, której nie chcesz nigdy zmieniać po utworzeniu wystąpienia obiektu.
zachowaj vs. kopiuj vs. przypisaj
źródło
atomic
jest tak samo złe, jak doradztwononatomic
. Żaden wybór nie jest „właściwy”, więc projektanci języków wybrali bezpieczniejsze z tych dwóch rozwiązań. W rzeczywistościnonatomic
jest ogólnie lepszym wyborem, ponieważ pomija bardzo drogie zamki gwintowane. Jedynym powodematomic
jest to, że twoja właściwość może być ustawiona z wielu wątków (w takim przypadku jej pominięcie może doprowadzić do nadmiernego zwolnienia lub wycieku).Zanim dowiesz się o atrybutach @property, powinieneś wiedzieć, jakie jest zastosowanie @property.
@property oferuje sposób definiowania informacji, które klasa ma hermetyzować. Jeśli zadeklarujesz obiekt / zmienną za pomocą @property , wówczas ten obiekt / zmienna będzie dostępny dla innych klas importujących jego klasę.
Jeśli zadeklarujesz obiekt za pomocą @property w pliku nagłówkowym, musisz go zsyntetyzować za pomocą @synthesize w pliku implementacyjnym. Dzięki temu obiekt jest zgodny z KVC . Domyślnie kompilator zsyntetyzuje metody dostępu dla tego obiektu.
metodami dostępowymi są: setter i getter.
Przykład: .h
.m
Teraz kompilator zsyntetyzuje metody dostępu dla nazwy .
Lista atrybutów właściwości @
atomowy, nieatomowy, zachowaj, kopiuj, tylko do odczytu, do odczytu, przypisuj, mocny, getter = metoda, setter = metoda, unsafe_unretained
atomowe jest zachowaniem domyślnym. Jeśli obiekt zostanie zadeklarowany jako atomowy, staje się bezpieczny dla wątków. Bezpieczeństwo wątków oznacza, że jednocześnie tylko jeden wątek określonej instancji tej klasy może mieć kontrolę nad tym obiektem.
Jeśli wątek wykonuje metodę gettera, inny wątek nie może wykonać metody ustawiającej dla tego obiektu. To jest wolne.
Z tego powodu dostęp do właściwości nieatomowych jest szybszy niż atomowy.
Metoda settera zwiększy liczbę zatrzymań obiektu, dzięki czemu zajmie on pamięć w puli autorelease.
Nawet jeśli zmienny ciąg zostanie ustawiony, a następnie zmieniony, instancja przechwytuje dowolną wartość, jaką ma w momencie jego ustawienia. Żadne metody ustawiające i pobierające nie będą syntezowane.
teraz,
imię pozostanie niezmienione.
Kompilator wygeneruje getter, ale nie ustawiający.
Jest to przeciwieństwo tylko do odczytu.
Pamiętaj, że zachowaj i przypisz są zasadniczo wymienne, gdy jest włączone odśmiecanie.
Pochodzi z ARC.
W przypadku właściwości boolowskich (właściwości, które mają wartość TAK lub NIE) zwyczajowo metoda gettera zaczyna się od słowa „jest”
Metoda powinna kończyć się dwukropkiem.
Niebezpieczne odwołanie jest podobne do słabego odniesienia, ponieważ nie utrzymuje przy życiu powiązanego obiektu, ale nie zostanie ustawione na zero, jeśli obiekt docelowy zostanie zwolniony.
Jeśli musisz podać wiele atrybutów, po prostu dołącz je jako listę oddzieloną przecinkami, na przykład:
źródło
@property
pliku nagłówka, musisz go zsyntetyzować za pomocą@synthesize
pliku implementacji.” Nie zawsze. Na przykład: „Domyślniereadwrite
właściwość będzie wspierana przez zmienną instancji, która ponownie zostanie automatycznie zsyntetyzowana przez kompilator”. Od dok .Po przeczytaniu wielu artykułów postanowiłem zebrać wszystkie informacje o atrybutach razem:
Poniżej znajduje się link do szczegółowego artykułu, w którym można znaleźć te atrybuty.
Ogromne podziękowania dla wszystkich ludzi, którzy udzielają tutaj najlepszych odpowiedzi !!
Oto przykładowy opis z artykułu
Przykład:
Przykład:
Wyjaśnić:
Załóżmy, że istnieje właściwość ciągu atomowego o nazwie „nazwa”, a jeśli wywołasz [self setName: @ „A”] z wątku A, wywołaj [self setName: @ „B”] z wątku B i wywołaj [self name] z wątek C, wtedy wszystkie operacje na innym wątku będą wykonywane szeregowo, co oznacza, że jeśli jeden wątek wykonuje setter lub getter, wówczas inne wątki będą czekać. To sprawia, że właściwość „nazwa” odczytuje / zapisuje bezpiecznie, ale jeśli inny wątek D wywoła [uwolnienie nazwy] jednocześnie, wówczas ta operacja może spowodować awarię, ponieważ nie jest tu zaangażowane wywołanie setter / getter. Co oznacza, że obiekt jest bezpieczny do odczytu / zapisu (ATOMIC), ale nie jest bezpieczny dla wątków, ponieważ inne wątki mogą jednocześnie wysyłać do obiektu wiadomości dowolnego typu. Deweloper powinien zapewnić bezpieczeństwo wątków dla takich obiektów.
Jeśli właściwość „name” była nieatomowa, wówczas wszystkie wątki w powyższym przykładzie - A, B, C i D wykonają się jednocześnie, dając dowolny nieprzewidywalny wynik. W przypadku atomu, jeden z A, B lub C wykona się jako pierwszy, ale D może nadal wykonać równolegle.
Przykład:
Przykład:
Mocne i słabe wyjaśnienia, dzięki BJ Homer :
Wyobraź sobie, że naszym przedmiotem jest pies i że pies chce uciec (zostać zwolniony). Silne wskazówki są jak smycz dla psa. Dopóki masz przymocowaną do psa smycz, pies nie ucieknie. Jeśli pięć osób przywiąże smycz do jednego psa (pięć silnych wskaźników do jednego obiektu), pies nie ucieknie, dopóki wszystkie pięć smyczy nie zostanie odłączonych. Z drugiej strony, słabe wskaźniki są jak małe dzieci wskazujące na psa i mówiące: „Patrz! Pies!” Tak długo, jak pies jest nadal na smyczy, małe dzieci nadal mogą go widzieć i nadal będą go wskazywać. Jak tylko wszystkie smycze zostaną odpięte, pies ucieka bez względu na to, ile małych dzieci na niego wskazuje. Gdy ostatni silny wskaźnik (smycz) nie będzie już wskazywał na obiekt, obiekt zostanie zwolniony, a wszystkie słabe wskaźniki zostaną wyzerowane. Kiedy używamy słabego? Jedynym czasem, w którym chciałbyś użyć słabego, jest to, że chcesz uniknąć zatrzymywania cykli (np. Rodzic zachowuje dziecko, a dziecko zachowuje rodzica, więc żadne z nich nie zostanie nigdy zwolnione).
Przykład:
Przykład:
unsafe_unretained
-unsafe_unretained to kwalifikator własności, który mówi ARC, jak wstawiać wywołania zatrzymania / zwolnienia -unsafe_unretained to wersja ARC przypisania.
Przykład:
Przykład:
źródło
Dostęp do właściwości atomowych może mieć tylko jeden wątek na raz. Jest bezpieczny dla wątków . Domyślnie jest to atom. Należy pamiętać, że nie ma słowa kluczowego atomic
Nonatomic oznacza, że wiele wątków może uzyskać dostęp do elementu. Jest to wątek niebezpieczny
Dlatego należy zachować ostrożność podczas korzystania z atomu. Ponieważ wpływa to na wydajność twojego kodu
źródło
wolę te linki o właściwościach w celu-c w iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
źródło