2012-04-22 20 views
6

Mam niektóre stałe zakodowane w kilka różnych atm viewController i NSObject klasy. Jeden z facetów w mojej pracy powiedział, że powinienem umieścić je w klasie własnej (tj. Klasa stała)obiektyw c stałe klasa

Zastanawiam się, co będzie pro i con's tego typu projektu, a także jeśli jest coś, co powinno zrobić jakikolwiek wyjaśnienie, jak to zrobić byłoby wspaniale.

na przykład, po prostu utworzyć nową klasę NSObject i mieć kilka # definicji w nim? kiedy muszę ich użyć, czy podklasuję moją klasę stałych i używam stałych wewnątrz tej klasy, tak jakbym robiła jakąkolwiek inną metodę lub zmienną z innej klasy?

tj

myclass.theConstant 

każda pomoc byłaby znacznie appreicated.

+1

Manjunath wysłał znakomitą odpowiedź tutaj: http://stackoverflow.com/a/2377432/1218605 –

Odpowiedz

11

Stwórz stałe z rzeczami, które ich używają. Nie twórz globalnego pliku "wszystko stałe". To sprawia, że ​​kod ponownie wykorzystuje ogromny ból głowy. Na przykład, jeśli publikujesz powiadomienie, potrzebujesz ciągu nazwy powiadomienia. Więc umieściliście to w klasie, która wysyła powiadomienie:

Stałe nie są zazwyczaj metodami lub definicjami. Są po prostu stałymi globalnymi jak wyżej. Powinieneś unikać #define, gdy tylko jest to możliwe, ale są pewne miejsca, które są całkiem przydatne (jak stałe obiekty UIColor, które są frustrujące, aby zainicjować inaczej).

Poświęć trochę czasu w plikach nagłówkowych Apple, aby zobaczyć przykłady. Zajrzyj do UIWindow.h, UITableViewCell.h i UITableView.h, aby zapoznać się z kilkoma dobrymi przykładami ogólnego zdefiniowania stałych.

+0

w porządku, dziękuję za odpowiedź. dlaczego #define jest złe? z czystej ciekawości. –

+0

Zastanawiam się również, dlaczego definicje są złe dla stałych. Czy to z powodu braku bezpieczeństwa typu? – borrrden

+4

Scoping. Wpisz bezpieczeństwo. Można ocenić w debugerze. Lepsze ukrywanie informacji. Zmiana stałej nie wymaga ponownej kompilacji całego programu. Unika problemów z kompilacją umysłu, gdy definicje są przypadkowo przedefiniowane. Istnieją wyjątki, w których #define jest wymagany iw kilku przypadkach jest preferowany. Ale twoim domyślnym powinno być napisanie kodu w Objective-C, a nie w makrze preprocesora. Ponownie spójrz na Apple SDK, a zauważysz wyraźny brak #define z wyjątkiem bardzo szczególnych przypadków (np. NSAssert). –

0

Jeśli masz tylko #defines, nie musisz być w żadnej klasie - po prostu przyklej je do własnego pliku .h.