1

次のようにカスタムオブジェクトを保存しようとしていますが、エラーが発生しています。ここ NSUserDefaultsにカスタムオブジェクトを保存します

// store data 
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:pOrderElements.count]; 
for (id orderObject in pOrderElements) { 
    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:orderObject]; 
    [archiveArray addObject:personEncodedObject]; 
} 

NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; 
[userData setObject:archiveArray forKey:@"personDataArray"]; 


// retrive data 
NSData *data = [userData objectForKey:@"personDataArray"]; 
// the following line throws an error 
id retrieveData = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

がキャッチされない例外により 'NSInvalidArgumentException'、理由にアプリを終了私のpOrderElements

(lldb) po pOrderElements 
<__NSArrayM 0x174256b90>(
{ 
    category = 1; 
    imagePath = "products/chicken-kabob.png"; 
    name = "Baked Chicken"; 
    price = "5.49"; 
} 
) 

です: ' - [__ NSCFArrayはバイト]: 認識されていないセレクタはインスタンス0x174264f40に送られた'

+2

[NSUserDefaultsでカスタムオブジェクトを格納する方法]の可能性のある重複したようNSUserDefaultsからカスタムオブジェクトを取得http://stackoverflow.com/questions/2315948/how-to-store-custom-objects- in-nsuserdefaults) –

+0

私は答えに次のように言いましたが、私はエラーが発生しましたhttp://stackoverflow.com/questions/19720611/attempt-to-set-a-non-property-list-object-as-an-nsuserdefaults – hotspring

+0

エンコーダデコーダを実装しましたか? –

答えて

2

不正なオブジェクトをアーカイブ解除します。 NSArrayをNSUserDefaultsに保存します

NSArray * archiveArray = [userData objectForKey:@"personDataArray"]; 
for (NSData *personEncodedObject in archiveArray) { 
    id personObject = [NSKeyedUnarchiver unarchiveObjectWithData:personEncodedObject]; 
} 
1

まず、カスタムクラスを作成します。

CustomObject.h

#import <Foundation/Foundation.h> 

@interface CustomObject : NSObject 

@property(strong,nonatomic)NSString *name; 

@end 

CustomObject.m

#import "CustomObject.h" 

@implementation CustomObject 



- (void)encodeWithCoder:(NSCoder *)encoder { 
    //Encode properties, other class variables, etc 
    [encoder encodeObject:self.name forKey:@"name"]; 

} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 
     //decode properties, other class vars 
     self.name = [decoder decodeObjectForKey:@"name"]; 

    } 
    return self; 
} 

その後NSUserDefaults

CustomObjectクラスオブジェクトとストアを作成するには、この

CustomObject *object =[CustomObject new]; 
object.name = @"test"; 

NSMutableArray *arr = [[NSMutableArray alloc]init]; 
[arr addObject:object]; 

NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:encodedObject forKey:@"storeObject"]; 
[defaults synchronize]; 
のようなあなたのオブジェクトをストアド

は(この

NSData *storedEncodedObject = [defaults objectForKey:@"storeObject"]; 
    NSArray *arrStoreObject = [NSKeyedUnarchiver unarchiveObjectWithData:storedEncodedObject]; 
    for (int i=0; i<arrStoreObject.count; i++) 
    { 
     CustomObject *storedObject = [arrStoreObject objectAtIndex:i]; 
     NSLog(@"%@",storedObject.name); 

    } 
+0

それはあなたのために働くかどうか。私にホットスポットを教えてください –

関連する問題