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!

questionAnswers(4)

yourAnswerToTheQuestion