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?
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?
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
atomic
jest tak samo złe, jak doradztwo nonatomic
. Żaden wybór nie jest „właściwy”, więc projektanci języków wybrali bezpieczniejsze z tych dwóch rozwiązań. W rzeczywistości nonatomic
jest ogólnie lepszym wyborem, ponieważ pomija bardzo drogie zamki gwintowane. Jedynym powodem atomic
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
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Teraz kompilator zsyntetyzuje metody dostępu dla nazwy .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
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.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
Z tego powodu dostęp do właściwości nieatomowych jest szybszy niż atomowy.
@property (nonatomic)NSString *name;
Metoda settera zwiększy liczbę zatrzymań obiektu, dzięki czemu zajmie on pamięć w puli autorelease.
@property (retain)NSString *name;
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.
@property (copy) NSString *name;
teraz,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
imię pozostanie niezmienione.
Kompilator wygeneruje getter, ale nie ustawiający.
@property (readonly) NSString *name;
Jest to przeciwieństwo tylko do odczytu.
@property (readwrite) NSString *name;
Pamiętaj, że zachowaj i przypisz są zasadniczo wymienne, gdy jest włączone odśmiecanie.
@property (assign) NSInteger year;
Pochodzi z ARC.
@property (nonatomic, strong) AVPlayer *player;
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”
@property (getter=isFinished) BOOL finished;
Metoda powinna kończyć się dwukropkiem.
@property(setter = boolBool:) BOOL finished;
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.
@property (unsafe_unretained) NSObject *unsafeProperty;
Jeśli musisz podać wiele atrybutów, po prostu dołącz je jako listę oddzieloną przecinkami, na przykład:
@property (readonly, getter=isFinished) BOOL finished;
@property
pliku nagłówka, musisz go zsyntetyzować za pomocą @synthesize
pliku implementacji.” Nie zawsze. Na przykład: „Domyślnie readwrite
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:
- atomic // default
- nieatomowy
- strong = zachowaj // default
- słaby = niebezpieczny_otrzymany
- zachować
- przypisać // domyślnie
- unsafe_unretained
- Kopiuj
- tylko czytać
- readwrite // default
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:
@property (retain) NSString *name;
@synthesize name;
Przykład:
@property (nonatomic, retain) NSString *name;
@synthesize name;
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:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Przykład:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
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:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Przykład:
@property (nonatomic, assign) NSString *address;
@synthesize address;
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:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Przykład:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
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
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