*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value ‘<Student: 0x8399f70>’

来源:互联网 发布:吊装计算软件 编辑:程序博客网 时间:2024/05/18 05:01

查看官方的API,NSUserDefaults支持保存的数据类型有:NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary

对于,我们创建的NSObject不可以直接保存,如果调用setObject,会提示出错,信息如下:

*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value ‘<Student: 0x8399f70>’ of class ‘Student’.  Note that dictionaries and arrays in property lists must also contain only property values.

当保存一个Student对象时,提示我,NSUserDefaults没有这样的属性,那么如果想要保存student中的信息,可以将studnet的信息保存到一个NSDictionary中,然后获取到这个NSDictionary,再从它里面获取每一个属性;

当然这种方式弱爆了,注意一下上面保存的类型可以保存NSData类型,不防将Student类转换为NSData类型,然后

取值时再将NSData转化为Student类;

还是用代码来说明:

Student.h 代码

   1:  #import <Foundation/Foundation.h>
   2:   
   3:  @interface Student : NSObject <NSCoding>
   4:  {
   5:      NSString *name;
   6:  }
   7:  @property (nonatomic, retain) NSString *name;
   8:   
   9:   
  10:  @end

Student.m 代码

   1:  #import "Student.h"
   2:   
   3:  @implementation Student
   4:  @synthesize name;
   5:   
   6:   
   7:  - (void)encodeWithCoder:(NSCoder *)aCoder
   8:  {
   9:      [aCoder encodeObject:self.name forKey:@"name"];
  10:  }
  11:   
  12:  - (id)initWithCoder:(NSCoder *)aDecoder
  13:  {
  14:      self = [super init];
  15:  if (self) {
  16:          self.name = [aDecoder decodeObjectForKey:@"name"];
  17:      }
  18:  return self;
  19:  }
  20:   
  21:   
  22:  - (void)dealloc
  23:  {
  24:      [name release];
  25:      name = nil;
  26:      [super dealloc];
  27:  }
  28:  @end

 

调用的代码:

   1:      Student *student = [[Student alloc] init];
   2:      [student setName:@"Jordy"];
   3:   
   4:      NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
   5:   
   6:      NSData *studentData = [NSKeyedArchiver archivedDataWithRootObject:student];
   7:      [userDefault setObject:studentData forKey:@"Student"];
   8:      [userDefault synchronize];
   9:      [student release];
  10:  
  11:  
  12:      NSData *data = [userDefault objectForKey:@"Student"];
  13:      Student *stu = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  14:      NSLog(@"stu: %@, stu.name: %@",stu,stu.name);转自:http://mario6.diandian.com/post/2013-02-28/40049432651
0 0
原创粉丝点击