カスタム オブジェクトを含む 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;
}