IPhone serialization issue

I need to save my own created class to a file that I found on the Internet, which is a good approach - use NSKeyedArchiver and NSKeyedUnarchiver The definition of my class is as follows:

@interface Game : NSObject <NSCoding> {

    NSMutableString *strCompleteWord;
    NSMutableString *strWordToGuess;

    NSMutableArray *arGuessedLetters;    //This array stores characters
    NSMutableArray *arGuessedLettersPos;  //This array stores CGRects

    NSInteger iScore;
    NSInteger iLives;
    NSInteger iRocksFallen;

    BOOL bGameCompleted;
    BOOL bGameOver;
}

I implemented the methods initWithCoder:and encodeWithCoder:in the following way:

- (id)initWithCoder:(NSCoder *)coder
    {   
        if([coder allowsKeyedCoding])
        {
            strCompleteWord = [[coder decodeObjectForKey:@"CompletedWord"] copy];
            strWordToGuess = [[coder decodeObjectForKey:@"WordToGuess"] copy];
            arGuessedLetters = [[coder decodeObjectForKey:@"GuessedLetters"] retain];
        //  arGuessedLettersPos = [[coder decodeObjectForKey:@"GuessedLettersPos"] retain];
            iScore = [coder decodeIntegerForKey:@"Score"];
            iLives = [coder decodeIntegerForKey:@"Lives"];
            iRocksFallen = [coder decodeIntegerForKey:@"RocksFallen"];
            bGameCompleted = [coder decodeBoolForKey:@"GameCompleted"];
            bGameOver = [coder decodeBoolForKey:@"GameOver"];
        }
        else
        {
            strCompleteWord = [[coder decodeObject] retain];
            strWordToGuess = [[coder decodeObject] retain];
            arGuessedLetters = [[coder decodeObject] retain];
        //  arGuessedLettersPos = [[coder decodeObject] retain];
            [coder decodeValueOfObjCType:@encode(NSInteger) at:&iScore];
            [coder decodeValueOfObjCType:@encode(NSInteger) at:&iLives];
            [coder decodeValueOfObjCType:@encode(NSInteger) at:&iRocksFallen];
            [coder decodeValueOfObjCType:@encode(BOOL) at:&bGameCompleted];
            [coder decodeValueOfObjCType:@encode(BOOL) at:&bGameOver];
        }

        return self;
    }

    - (void)encodeWithCoder:(NSCoder *)coder
    {
        if([coder allowsKeyedCoding])
        {
            [coder encodeObject:strCompleteWord forKey:@"CompleteWord"];
            [coder encodeObject:strWordToGuess forKey:@"WordToGuess"];
            [coder encodeObject:arGuessedLetters forKey:@"GuessedLetters"];
            //[coder encodeObject:arGuessedLettersPos forKey:@"GuessedLettersPos"];
            [coder encodeInteger:iScore forKey:@"Score"];
            [coder encodeInteger:iLives forKey:@"Lives"];
            [coder encodeInteger:iRocksFallen forKey:@"RocksFallen"];
            [coder encodeBool:bGameCompleted forKey:@"GameCompleted"];
            [coder encodeBool:bGameOver forKey:@"GameOver"];
        }
        else
        {
            [coder encodeObject:strCompleteWord];
            [coder encodeObject:strWordToGuess];
            [coder encodeObject:arGuessedLetters];
            //[coder encodeObject:arGuessedLettersPos];
            [coder encodeValueOfObjCType:@encode(NSInteger) at:&iScore];
            [coder encodeValueOfObjCType:@encode(NSInteger) at:&iLives];
            [coder encodeValueOfObjCType:@encode(NSInteger) at:&iRocksFallen];
            [coder encodeValueOfObjCType:@encode(BOOL) at:&bGameCompleted];
            [coder encodeValueOfObjCType:@encode(BOOL) at:&bGameOver];
        }
    }

And I use these methods to archive and decompress data:

[NSKeyedArchiver archiveRootObject:currentGame toFile:strPath];
Game *currentGame = [NSKeyedUnarchiver unarchiveObjectWithFile:strPath];

I have two problems.

1) As you can see, the lines with are arGuessedLettersPoscommented out, because every time I try to encode this array, an error occurs (this archiver cannot encode structures), and this array is used to store CGRect structures. I saw the solution on the Internet. The fact is that everyone CGRectin the array is converted to NSString(using NSStringFromCGRect()), and then stored. Is this a good approach?

2) . , , () , () , . , currentGame , .

? , unarchivers.

.

+3
4

...

- (id) initWithCoder: (NSCoder) coder - (void) encodeWithCoder: (NSCoder) :

    NSMutableData *data = [NSMutableData alloc];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver encodeObject:self.strCompleteWord forKey:@"CompleteWord"];
    [archiver encodeObject:self.strWordToGuess forKey:@"WordToGuess"];
    [archiver encodeObject:self.arGuessedLetters forKey:@"GuessedLetters"];
    //[coder encodeObject:self.arGuessedLettersPos forKey:@"GuessedLettersPos"];
    [archiver encodeInteger:self.iScore forKey:@"Score"];
    [archiver encodeInteger:self.iLives forKey:@"Lives"];
    [archiver encodeInteger:self.iRocksFallen forKey:@"RocksFallen"];
    [archiver encodeBool:self.bGameCompleted forKey:@"GameCompleted"];
    [archiver encodeBool:self.bGameOver forKey:@"GameOver"];

    [archiver finishEncoding];

    [data writeToFile:strPath atomically:YES];

    [data release];

    NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:strPath];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    self.strCompleteWord = [[unarchiver decodeObjectForKey:@"CompletedWord"] copy];
    self.strWordToGuess = [[unarchiver decodeObjectForKey:@"WordToGuess"] copy];
    self.arGuessedLetters = [[unarchiver decodeObjectForKey:@"GuessedLetters"] retain];
    //self.arGuessedLettersPos = [[unarchiver decodeObjectForKey:@"GuessedLettersPos"] retain];     
    self.iScore = [unarchiver decodeIntegerForKey:@"Score"];
    self.iLives = [unarchiver decodeIntegerForKey:@"Lives"];
 self.iRocksFallen = [unarchiver decodeIntegerForKey:@"RocksFallen"];
   self.bGameCompleted = [unarchiver decodeBoolForKey:@"GameCompleted"];
    self.bGameOver = [unarchiver decodeBoolForKey:@"GameOver"];

    [unarchiver finishDecoding];
    [data release];

:)

+2

, , .

, :

  • NSLog ( -shift-R xcode), , /.
  • , . , , /tmp/my _archive_file. , (a) , (b) , (, "RocksFallen" ) gooblygoo.

allowsKeyed(En)coding, , , NSKeyed(Un)archiver, . , .

CGRect s: , NSMutableArray, ? , - , , NSCoding . , .

+1

.

, , RocksFallen .., , . .

NSLogs , . ... , , , , . - . , , . NSLog , . , , (initwithcoder) .. , . . , . , , , , initWithCoder , ..

, , .

0

( ) - NSData.

, :

for (int i = 0; i < items; i++) {

   NSString *keyValue = [NSString stringWithFormat:@"YourStruct%i", i ];
   NSData    *dataset = [NSData dataWithBytes:(void*)&activeprofile[i] length:(sizeof(profileset))];  

   [encoder encodeObject:dataset forKey:keyValue];    // makes a nice, solid data block

}

:

for (int i = 0; i < items; i++) {

    NSString *keyValue = [NSString stringWithFormat:@"YourStruct%i", i ];
    NSData    *dataset = [decoder decodeObjectForKey:keyValue];

    [dataset getBytes:&activeprofile[i] length:sizeof(profileset)];

}

: , !

: http://borkware.com/quickies/one?topic=NSCoder , NSArchive iPhone .

0

Source: https://habr.com/ru/post/1714904/


All Articles