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!

Author: fmchan, 2013-01-09

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
...
 58
Author: foundry,
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.

 1
Author: Alex Zavatone,
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