NSMutableArray с неверными атрибутами пользовательского объекта - PullRequest
0 голосов
/ 16 сентября 2011

Я сохранил массив nsmutable с пользовательскими объектами в NSUserDefault. Но когда я получаю данные, я получаю массив с объектами, но когда я пытаюсь перебрать объекты, происходит сбой приложения и в локальном отладчике я получаю недействительный

CFStringRef и журнал - [Название сообщения]: нераспознанный селектор отправлен на экземпляр 0x187900.

Мой пользовательский объект следует протоколу NSCoding и, если я распечатываю массив, показывает объект и память, выделяемые в шестнадцатеричном формате.

Мое сообщение. Я изменил имя на атрибуты для тестирования:

  #import "Message.h"

  @implementation Message
  @synthesize tittel, adresse, dato;
  static NSString *titleKey = @"title";
  static NSString *urlKey = @"url";
  static NSString *dateKey = @"date";

 - (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self != nil) {
      self.tittel = [decoder decodeObjectForKey:titleKey];
       self.adresse = [decoder decodeObjectForKey:urlKey];
      self.dato = [decoder decodeObjectForKey:dateKey];
   }
   return self;
}   

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.tittel forKey:titleKey];
[encoder encodeObject:self.adresse  forKey:urlKey];
[encoder encodeObject:self.dato forKey:dateKey];

 }

-(void)dealloc{

[dato release];
[tittel release];
[adresse release];
[super dealloc];
}
@end

Методы, в которых я сохраняю и пытаюсь получить объекты:

- (void) saveToFile: (NSMutableArray *) входящий {

NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];
if (standardUserDefault) {

    [standardUserDefault setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithArray:incoming]] forKey:@"Messages"];
    [standardUserDefault synchronize];
}

 NSLog(@"Messages array saved. (%d message in array)",[incoming count]);

}
-(NSMutableArray*)returnFromFile{

NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];
NSData * dataCheck = [[NSData alloc]initWithData:[standardUserDefault objectForKey:@"Messages"]];

NSMutableArray *retro;
if(dataCheck != nil){
    NSArray *load = [NSKeyedUnarchiver unarchiveObjectWithData:dataCheck];
    if(load != nil){
        retro = [NSMutableArray arrayWithArray:load];
    }
    else
        retro = [[NSMutableArray alloc]init];
}
NSLog(@"Checking saved array (%d assignments in array)",[retro count]);

for(Message *m in retro){
   NSLog(@"%@", m.tittel);   //It crash here. 

}

return retro;

}

1 Ответ

0 голосов
/ 19 сентября 2011

Я решил это!

Только что сделал новый класс, почти такой же.Разница лишь в том, что я использовал стандартный метод init, где я инициирую все атрибуты и initWithCoder.И это сработало.Это происходит до этого, если в gcc произошла ошибка или я пытаюсь скомпилировать класс, который не следует протоколам, которые продолжают показывать ту же ошибку.Это иногда помогает создать что-то точно такое же или с незначительной разницей и компилировать.Похоже, компилятор не всегда очищает память.

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