2016-05-26 12 views
5

Podczas generowania kodu XC podklasy NSManagedObject tworzy dwa dodatkowe pliki MyObject+CoreDataProperties.h & MyObject+CoreDataProperties.m, aby zachować elementy CoreData z dala od naszego własnego kodu.Utworzona podklasa NSManagedObject + pliki CoreDataProperties.m faktycznie nie są wymagane?

To jest ładne, ale zauważyłem w klipie WWDC, że nie ma pliku +CoreDataProperties.m w swoim przykładzie. Więc próbowałem usunąć je w moim kodzie i wszystko kompiluje się i działa dobrze bez nich, nie wydają się być wcale potrzebne.

Czy są one wymagane w jakiś sposób, który przeoczyłem, a jeśli nie, to dlaczego w ogóle je generuje?

+2

Oddzielne pliki są użyteczne, jeśli chcesz dodać dodatkowe właściwości/zmienne instancji do klasy, porównaj http://stackoverflow.com/questions/34063965/nsmanagedobject-subclass-property-in-category. –

+0

Po to właśnie jest 'MyObject. *', Automatycznie wygenerowane 'MyObject + CoreDataProperties. *' Powinny pozostać nietknięte, aby można było je zregenerować, jeśli zmienisz model. – trapper

Odpowiedz

3

Krótka odpowiedź:

Nie, nie jest to konieczne.

Długa odpowiedź:

Objective-C jest dynamiczna wpisywanie, późne wiązanie język programowania. W krótkiej formie oznacza to, że każda decyzja dotycząca typu może zostać podjęta w czasie wykonywania, a nie w czasie kompilacji, a ponadto można uzyskać dostęp do właściwości wiadomości i wysyłać je do obiektu bez znajomości jego typu (klasy).

Ale nie jest konieczne dla struktury danych podstawowych, a Ty jako użytkownik danych podstawowych i model znać typ obiektu zarządzanego dla typu jednostki. Nie jest nawet konieczne posiadanie określonego typu dla typu jednostki. (Nie generuję klas bardzo często, a jeśli to robię, robię to ręcznie.) W związku z tym, w przeciwieństwie do innych języków programowania, te wygenerowane klasy nie są konieczne, aby nadać kompilatorowi typ.

Jednak kompilator chce co najmniej co najmniej jedną metodę zobaczyć sygnaturę (wpisywanie parametrów). W przeciwnym razie ostrzeże. Nawet to jest możliwe, że kod pracuje jak ten ...

NSManagedObject *person = … 
NSString *firstName = [person firstName]; 

... dla typu podmiotu Person z nieruchomości firstName, kompilator będzie cię ostrzec, że nie wie nic o sposobie –firstName znać.

Zamiast tego można wpisać coś takiego:

NSManagedObject *person = … 
NSString *firstName = [person valueForKey:@"firstName"]; 

(Kompilator wie -valueForKey:, ponieważ jest to metoda zadeklarowana w NSObject.)

Oprócz tego można uzyskać korzyści, takich jak uzupełnianie kodu, należy sprawdzić błędy pisowni i tak dalej. Ale nie musisz używać narzędzia do generowania kodu w Xcode. Po prostu zadeklaruj taką klasę i we właściwościach interfejsu. Akcesory można generować dynamicznie za pomocą @dynamic. (Osobiście prawie nigdy nie używam generowania statycznego kodu.)

Edytuj: Dodano wynik dyskusji w komentarzach.

A więc mając interfejs (".h-plik") kategorii, kompilator wie wystarczająco dużo, aby skompilować cały kod bez ostrzeżeń. Będzie działać w środowisku wykonawczym, jeśli jest gwarantowane - lub sprawdzane w czasie wykonywania - że można wysłać odpowiednią wiadomość. Ma to sens w wielu sytuacjach od samego początku Objective-C, i. mi. do przekazywania i nieformalnych protokołów. W kontekście danych podstawowych służy do dynamicznego generowania standardowych metod dostępu. Wszystko działa dobrze bez żadnej implementacji.

Jednak z pewnych powodów chce się wdrożyć, ja. mi. utrzymanie na zmianach wartości. W takim przypadku dobrze jest mieć implementację kodu pośredniczącego, którą można edytować. Ale dla standardowego zachowania nie jest to konieczne.

+0

Ale to pochodzi z pliku nagłówkowego 'MyObject + CoreDataProperties.h', mówię o pliku' MyObject + CoreDataProperties.m'. Jeśli usunę pliki .m, nie otrzymam ostrzeżeń kompilatora i normalnego zakończenia kodu IDE, nie będę musiał używać 'valueForKey' lub czegoś w tym stylu. – trapper

+0

To prawda, o ile mówimy o właściwościach, ponieważ wtedy kompilator widzi metody dostępu (bez ostrzeżenia) i Core Data może je generować dynamicznie w czasie wykonywania (bez problemu rt), jak wspomniano. Jednak jest to podobne do "podchwytliwego", aby to zrobić, i będzie pękać, gdy dodasz do klasy inne metody lub znaki, ponieważ nie są one tworzone dynamicznie. –

+0

Inne metody i ivars przechodzą do 'MyObject.h' i' MyObject.m', więc nic się tam nie złamie. – trapper

Powiązane problemy