NSInteger и decodeInteger: forKey: Проблемы - PullRequest
3 голосов
/ 07 января 2010

У меня есть два следующих метода архивирования:

    - (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;
}

И заголовок:

    @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

Кажется, достаточно просто. encodeInteger принимает NSInteger, который я передаю ему, и decodeIntegerForKey возвращает NSInteger, но я получаю странные ошибки:

предупреждение: недопустимый тип получателя 'NSInteger'

и когда выполняется инструкция decodeIntegerForKey, я получаю неправильный доступ exec.

Почему это происходит?

Ответы [ 2 ]

8 голосов
/ 07 января 2010

Есть несколько проблем с размещенным кодом.Первое:

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

Этот код отправляет 'retain' в NSInteger.NSIntegers не являются объектами, они просто скаляры.Это незаконно.Просто используйте вместо этого:

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

Далее этот код:

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

Превышение удержания и приведет к утечке.Поскольку вы объявили упражнения следующим образом:

@property(nonatomic,retain) NSMutableArray *exercises; 

Это «сохранение» означает, что когда вы вызываете установщик, оно сохранит переданное значение, прежде чем вставить его в переменную экземпляра «упражнения».Вы сохраняете данные до вызова сеттера, так что это двойное удержание.

Вы можете исправить это, изменив код на:

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

Или:

self.exercises =   [decoder decodeObjectForKey:@"exercises"];
1 голос
/ 07 января 2010

Установлена ​​ли цель развертывания вашего проекта на Mac OS 10.5 или новее? NSInteger был введен только в Leopard, поэтому, если вы нацеливаетесь на Tiger, вам нужно будет предоставить реализации NSInteger и -decode/encodeIntegerForKey:

Кроме того, как правило, вам следует избегать использования методов доступа при установке ivars в методах init. Как правило, вы должны просто установить ivars напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...