NSInteger and decodeInteger: forKey: problems

I have two archiving methods:

    - (void) encodeWithCoder: (NSCoder *) encoder {
    [encoder encodeObject:self.exercises forKey:@"exercises"];
    [encoder encodeObject:self.title forKey:@"title"];
    [encoder encodeObject:self.description forKey:@"description"];
    [encoder encodeInteger:self.idnum forKey:@"idnum"];
    [encoder encodeInteger:self.rating forKey:@"rating"];
    [encoder encodeInteger:self.frequency forKey:@"frequency"];
    NSLog(@"Encoding!");

}

- (id) initWithCoder: (NSCoder *) decoder {
    self.exercises =   [[decoder decodeObjectForKey:@"exercises"] retain];
    self.title =       [[decoder decodeObjectForKey:@"title"] retain];
    self.description = [[decoder decodeObjectForKey:@"description"] retain];
    self.idnum =       [[decoder decodeIntegerForKey:@"idnum"] retain];
    self.rating =      [[decoder decodeIntegerForKey:@"rating"] retain];
    self.frequency =   [[decoder decodeIntegerForKey:@"frequency"] retain];
    NSLog(@"Decoding!");
    return self;
}

And the title:

    @interface Workout : NSObject{

    NSMutableArray *exercises; 
    NSString *title;
    NSString *description;
    NSInteger idnum;
    NSInteger rating;
    NSInteger frequency;
}

- (void) encodeWithCoder: (NSCoder *) encoder;
- (id) initWithCoder: (NSCoder *) decoder;

@property(nonatomic,retain) NSMutableArray *exercises; 
@property(nonatomic,retain) NSString *title;
@property(nonatomic,retain) NSString *description;
@property(nonatomic) NSInteger idnum;
@property(nonatomic) NSInteger rating;
@property(nonatomic) NSInteger frequency;
@end

It seems simple enough. encodeInteger accepts an NSInteger, which I pass to it, and decodeIntegerForKey returns an NSInteger, but I get these strange errors:

warning: invalid receiver type 'NSInteger'

and when decodeIntegerForKey command is executed, I get bad access exec.

Why is this happening?

+3
source share
2 answers

There are a couple of issues with published code. Firstly:

self.idnum =       [[decoder decodeIntegerForKey:@"idnum"] retain];

This code sends a "save" to NSInteger. However, NSIntegers are not objects, they are just scalars. It's illegal. Just use this instead:

self.idnum =       [decoder decodeIntegerForKey:@"idnum"];

Further, this code:

self.exercises =   [[decoder decodeObjectForKey:@"exercises"] retain];

. :

@property(nonatomic,retain) NSMutableArray *exercises; 

, , "". , , .

, :

exercises =   [[decoder decodeObjectForKey:@"exercises"] retain];

:

self.exercises =   [decoder decodeObjectForKey:@"exercises"];
+8

Mac OS 10.5 ? NSInteger Leopard, , Tiger, NSInteger -decode/encodeIntegerForKey:

, ivars init. ivars .

+1

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


All Articles