Czy mam deklarować zmienne w interfejsie czy używać właściwości w objective - C arc?
Podejście 1:
@interface MyController : UIViewController {
UILabel *myText;
}
@property (nonatomic, strong) UILabel *myText;
Podejście 2:
@interface MyController : UIViewController
@property (nonatomic, strong) UILabel *myText;
Podejście 3:
@interface MyController : UIViewController {
UILabel *myText;
}
Czytałem kilka artykułów mówiących o tego typu rzeczach, ale nadal nie zdaję sobie sprawy, które podejście mam przyjąć.
Odkryłem również, że ktoś powiedział, że podejście 1 to stary sposób, więc chciałbym poznać najlepszą praktykę dla ios sdk 6 za pomocą ARC.
Wiem, że deklarowanie zmiennych za pomocą właściwości jest łatwym sposobem generowania gettera i settera i ktoś zasugerował jej użycie. Jednakże, chciałbym zapytać w przypadku, gdy zmienna nie jest do wywołania przez inną klasę, czy jest to konieczne dla zmiennej używającej właściwości? i ustawić ją jako zmienną prywatną wewnątrz interfejsu? A może lepiej dla zmiennej deklarującej tylko wewnątrz interfejsu? Chciałbym nauczyć się najlepszych praktyk, więc proszę mi wybaczyć, jeśli to głupie pytanie.
Ponadto niektórzy programiści piszą @synthesize w ten sposób
@synthesize myText=_myText;
Ale niektórzy piszą tak:
@synthesize myText;
Chciałbym również wiedzieć różnica i który z nich jest lepszy?
Dziękuję bardzo!
2 answers
Najbardziej nowoczesny sposób1:
- w miarę możliwości deklaruj właściwości
- nie deklaruj ivarów osobno 2
- don 't @ synthesize 3
- zlokalizuj jak najmniej właściwości w sobie .plik h 4
- zlokalizuj jak najwięcej właściwości w rozszerzeniu klasy w Twoim .plik m 5
1 od Xcode 4.5.2. Większość odnosi się do 4.4, część nie kompiluje się na 4.2 (the ostatnia wersja dostępna pod Snow Leopard). To rzeczy preprocesora, więc wszystko jest kompatybilne przynajmniej z iOS5 (nie testowałem na iOS4, ale to też powinno być OK).
2 nie ma sensu deklarować iVar jak również jako własność. Jestem pewien, że jest kilka niejasnych przypadków, w których chciałbyś zadeklarować iVars zamiast właściwości, ale nie mogę wymyślić żadnego.
3 Xcode utworzy iVar o tej samej nazwie co właściwość, poprzedzone znakiem _underscore. Jeśli (rzadko) potrzebujesz innego rodzaju zachowania, możesz ręcznie @synthesize property = someOtherName
. @vikingosegundo linkuje do tego artykułu o Dynamic ivars , który jest przypadkiem użycia dla @synthesize
. @RobNapier komentuje, że ty robisz musisz @synthesize iVar = _iVar
(o dziwo) jeśli tworzysz własne gettery (readonly) i settery (read/write) dla właściwości, ponieważ w tym przypadku preprocesor nie wygeneruje dla ciebie iVar.
4 ogólna zasada z interfejsem: trzymaj go tak pustego, jak to tylko możliwe. Nie musisz teraz deklarować swoich metod , jeśli są one do użytku prywatnego. Jeśli możesz sprawić, że kod będzie działał bez deklaracji interfejsu, to jest droga do zrobienia.
5 to jest blok @ interface w Twoim .plik m, umieszczony nad twoją implementacją@:
#TestClass.m
@interface TestClass()
//private property declarations here
@end
@implementation TestClass
...
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-06-20 00:33:50
Możesz również użyć @synthesize, jeśli podoba ci się ładny spis treści właściwości @synthesized, do których możesz się odwoływać i komentować dla jasności i organizacji.
Ponadto @synthesize pozwala ustawić punkt przerwania właściwości i pułapki, gdy jej wartość zostanie zmieniona.
Kiedy kompilator robi wszystko za Ciebie, stajesz się zdystansowany od tego, co się naprawdę dzieje i ignorujesz to. Jednak nie konieczność wpisywania wszystkiego samodzielnie przez cały czas jest również nieźle.
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-07-11 15:49:13