2009-07-11 9 views
13

Następujący kod:Co to jest NSConcreteData i gdzie jest on zdefiniowany?

[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:mapURL]] 

zwraca wystąpienie NSConcreteData w przeciwieństwie do NSData (które oczekiwanego!). Co dokładnie reprezentuje NSConcreteData i dlaczego jest zwracana zamiast instancji NSData? Dalej, gdzie jest zdefiniowana ta klasa? XCode skarży się, że nie został zdefiniowany, ale nie wiem, co powinienem dołączyć, aby uzyskać klasę.

Każda pomoc doceniona!

Odpowiedz

19

Ramy Fundacji wykorzystują klastry klas w niektórych obszarach, aby zapewnić wspólny interfejs dla różnych klas. Oznacza to, że podczas korzystania z interfejsu API NSData w celu utworzenia obiektu NSData, rzeczywista klasa, która jest instancjonowana i zwrócona, jest inna niż NSData, ale może i powinna być traktowana i określana przez Twój kod jako obiekt NSData.

Pod koniec dnia prosta odpowiedź brzmi: zignoruj ​​istnienie NSConcreteData i potraktuj to jako NSData.

Więcej informacji na temat klastrów klas można znaleźć w sekcji klastrów klas w Apple Cocoa Fundamentals Guide.

+4

znalazłem korzeń mojego problemu będzie czek na [sub isMemberOfClass: [NSData klasy]] zamiast [sub isKindOfClass: [klasa NSData]] Te ostatnie Zwraca true jeśli sub jest instancja klasy wywodząca się z NSData, podczas gdy pierwsza nie. Pozdrawiam! – Codebeef

+2

Po prostu uwaga, nie zawsze można traktować NSContreteData jako NSData, na przykład: podczas próby serializowania JSON. Spowoduje to zgłoszenie wyjątku: Zakończenie aplikacji z powodu nieprzechwyconego wyjątku "NSInvalidArgumentException", powód: "Nieprawidłowy typ w JSON write (NSConcreteData)" – Tim