0

我想在NSUserDefaults中保存一个对象,但是我没有成功。情景是,我有SyncObjct类的对象syncObject。我在SyncObject类中实现了以下方法在NSUserDefaults中存储自定义对象

- (NSMutableDictionary*)toDictionary; 
+ (SyncObject*)getFromDictionary :(NSMutableDictionary*)dictionary; 
- (id) initWithCoder: (NSCoder *)coder; 
- (void) encodeWithCoder: (NSCoder *)coder; 

而且SyncObject类是NSCoding类。现在,SyncObject类包含一个名为jobsArray的NSMutableArray。该数组包含类JobsObject的对象。我为这个类实现了上述相同的方法,以使它符合编码。在SyncObject类的toDictionary方法中,我通过编写以下行将此数组存储在字典中。

[dictionary setValue:jobsArray forKey:@"jobsArray"]; 

我正在通过编写以下行在SyncOject类的getFromDictionary方法中检索它。

+ (SyncObject*)getFromDictionary :(NSMutableDictionary*)dictionary 
{  
    NSLog(@"SyncObject:getFromDictionary"); 
    SyncObject *syncObject = [[SyncObject alloc] init]; 

    @try 
    { 

     syncObject.noOfJobs = [[dictionary valueForKey:@"noOfJobs"] intValue]; 
     syncObject.totalJobsPerformed = (TotalJobsPerformed*)[dictionary valueForKey:@"totalobsPerformed"]; 
     syncObject.jobsArray = [dictionary valueForKey:@"jobsArray"]; 

    } 
    @catch (NSException * e) 
    { 
     NSLog(@"EXCEPTION %@: %@", [e name], [e reason]); 
    } 
    @finally 
    { 

    } 

    return syncObject; 
} 

而且我还通过编写以下行在NSUserDefault中存储syncObject。

NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:syncObject]; 
[userStorage setObject:myEncodedObject forKey:SYNC_OBJECT]; 

我NSUserDefaults的从通过编写以下行

NSData *myEncodedObject = [userStorage objectForKey: SYNC_OBJECT]; 
    syncObject = (SyncObject*)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject]; 

问题检索对象是我不能够正确地检索jobsArray。一些无效的对象返回并且在尝试访问应用程序时崩溃。请谁能告诉我这个问题的原因?

问候

+0

您使用的线程?你叫NSUserDefault的同步吗? – daveoncode

回答

0

我相信问题是NSUserDefaults的不支持存储自定义对象类型。

从Apple的文档使用-setObject时:value参数可以只是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。对于NSArray和NSDictionary对象,其内容必须是属性列表对象。

您可以直接从Apple's NSUserDefault Class Reference manual查看其余的文档。

0

自定义类的.h

#import <Foundation/Foundation.h> 

@interface Person : NSObject 

@property(nonatomic, retain) NSArray *names; 

@property(strong,nonatomic)NSString *name; 


@end 

自定义类的.m

#import "Person.h" 

@implementation Person 
@synthesize names; 


- (void)encodeWithCoder:(NSCoder *)encoder { 
    [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; 
} 


@end 

要创建Person类对象和存储和检索您的NSUserDefaults的数据存储

存储你的对象:

#import "ViewController.h" 
#import "Person.h" 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UITextField *textBox; 

@end 

NSMutableArray *arr; 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)saveButton:(id)sender { 
    Person *person =[Person new]; 
    person.name = _textBox.text; 

    arr = [[NSMutableArray alloc]init]; 
    [arr addObject:person]; 

    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:encodedObject forKey:@"name"]; 
    [defaults synchronize]; 
} 
- (IBAction)showButton:(id)sender { 
    _label.text = @""; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSData *storedEncodedObject = [defaults objectForKey:@"name"]; 
    NSArray *arrStoreObject = [NSKeyedUnarchiver unarchiveObjectWithData:storedEncodedObject]; 

    for (int i=0; i<arrStoreObject.count; i++) 
    { 
     Person *storedObject = [arrStoreObject objectAtIndex:i]; 

     _label.text = [NSString stringWithFormat:@"%@ %@", _label.text , storedObject.name]; 

    } 


} 

@end 
相关问题