0

カスタム オブジェクトを含む nsmutable 配列を NSUserDefault に保存しました。しかし、取得しているときにオブジェクトを含む配列を取得しましたが、オブジェクトを反復処理しようとすると、アプリがクラッシュし、ローカル デバッガーで無効になりました

CFStringRef とログ - [メッセージ タイトル]: 認識されないセレクターがインスタンス 0x187900 に送信されました。

私のカスタム オブジェクトは NSCoding プロトコルに従います。配列を出力すると、オブジェクトとメモリの割り当てが 16 進数で表示されます。

私のメッセージ。テスト用に名前を属性に変更しました。

  #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 *)incoming{

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;

}

4

1 に答える 1

0

解決しました!

ほぼ同じ、新しいクラスを作成しました。唯一の違いは、すべての属性と initWithCoder を開始する標準の init メソッドを使用したことです。そして、それはうまくいきました。その前に、gcc にエラーが発生した場合、または同じエラーを表示し続けるプロトコルに従わないクラスをコンパイルしようとした場合に発生します。まったく同じものを作成したり、マイナーな違いを持っ​​てコンパイルしたりするのに役立つ場合があります。コンパイラが常にメモリをフラッシュするとは限らないようです。

于 2011-09-19T09:42:04.357 に答える