NSKeyedArchiver i NSKeyedUnarchiver z NSMutableArray
Mam nadzieję, że nie ma to nic wspólnego z faktem, że używam tutaj tablicy Mutable, ale ta jest dla mnie zaskakująca, więc nie byłbym zaskoczony, gdyby tak było.
TŁO:
Zrobiłem małą bazę danych, która jest zasadniczo NSMutableArray zawierającą obiekty niestandardowe, które możemy wywołać recordObjects. Ustawiłem tablicę:
<code>database = [[NSMutableArray alloc] init]; </code>
a mój niestandardowy obiekt o nazwie „recordObject” zawiera następujące zmienne i działa:
<code>NSString *name; int anInt; Bool aBool; </code>
Zsyntetyzowałem również metody, dzięki czemu mogę wykonywać połączenia typu:
<code>aString = [[database objectAtIndex:someIndex] name]; </code>
I dodałem metody do mojej klasy kontrolera, aby dodawać, usuwać i wybierać poszczególne rekordy do wyświetlenia. Do tej pory wszystko działa poprawnie i dokładnie zgodnie z oczekiwaniami.
Następnie ustawiłem klasę recordObject (podklasa NSObject), aby użyć NSCoder (włączając dyrektywę @interface i dodałem następujące niestandardowe metody kodowania i dekodowania w pliku implementacji:
<code>-(void) encodeWithCoder: (NSCoder *) encoder { [encoder encodeObject: name forKey: @"recordName"]; [encoder encodeInt: anInt forKey: @"recordInteger"]; [encoder encodeBool: aBool forKey: @"recordBool"]; } -(id) initWithCoder: (NSCoder *) decoder { name = [decoder decodeObjectForKey: @"recordName"]; anInt = [decoder decodeIntForKey: @"recordInteger"]; aBool = [decoder decodeBoolForKey: @"recordBool"]; } </code>
Aby napisać plik, użyłem następujących:
<code>[NSKeyedArchiver archiveRootObject:database toFile:myPath]; </code>
Kiedy uruchamiam program, wszystko POJAWI SIĘ, aby działać poprawnie. Metoda kodera jest wywoływana dla każdego rekordu w tablicy, a plik jest zapisywany na dysku. Otwarcie pliku za pomocą TextEdit pokazuje, że dane są tam (choć w większości niezrozumiałe dla mnie).
PROBLEM:
Oto, gdzie wpadłem w szkopuł.
Dodałem następujący kod, aby załadować plik do mojej tablicy bazy danych:
<code>database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath]; </code>
Po ponownym uruchomieniu programu, tym razem ładowanie bazy danych, pojawia się, aby działać poprawnie. Moim pierwszym testem było użycie metody zliczania NSMutableArray:
<code>x = [database count]; </code>
W rezultacie X został wypełniony poprawną liczbą rekordów w pliku. Jeśli podczas zapisywania bazy danych było 5 rekordów, X jest ustawiany na 5 po załadowaniu bazy danych przy następnym wykonaniu programu.
Oto wielki problem:
Program ulega awarii, jeśli spróbuję użyć JAKICHKOLWIEK z moich metod dostępu. Na przykład, jeśli spróbuję użyć następującego po załadowaniu bazy danych:
<code>aString = [[database objectAtIndex:someIndex] name]; </code>
program ulega awarii i zwraca następujący błąd w konsoli:
<code>Program received signal: “EXC_BAD_ACCESS”. sharedlibrary apply-load-rules all </code>
Moja interpretacja jest taka, że dane nie są ładowane i inicjowane poprawnie w tablicy bazy danych z jakiegoś powodu, ale dla mojego życia nie mogę się dowiedzieć, gdzie się pomyliłem.
Na marginesie, wszystko, co wdrożyłem, pochodzi z książki Stephena G. Kochana „Programowanie w Objective-C”
Wszelkie pomysły byłyby bardzo mile widziane!