【问题标题】:Storing a NSArray of my Custom Objects in NSUserDefaults在 NSUserDefaults 中存储我的自定义对象的 NSArray
【发布时间】:2013-10-22 11:36:35
【问题描述】:

要求是我想将我的自定义对象的NSArray 存储在NSUserDefaults 中。 以下是我的示例中的代码

- (void)viewDidLoad
{
    [super viewDidLoad];

    sampleArray=[[NSMutableArray alloc]init];

    MyClass *obj1=[[MyClass alloc]init];
    obj1.name=@"Reetu";
    obj1.countOpen=1;
    NSArray *subArray = [[NSArray alloc]initWithObjects:@"likes131",@"likes132",          @"likes133", nil];
    obj1.hobbies = [[NSArray alloc]initWithObjects:@"like11", @"like12", subArray, nil];
    [sampleArray addObject:obj1];

    MyClass *obj2=[[MyClass alloc]init];
    obj2.name=@"Pinku";
    obj2.countOpen=2;
    NSArray *subArray2 = [[NSArray alloc]initWithObjects:obj1 ,@"likes231",@"likes232",  @"likes233", obj1 ,nil];
obj2.hobbies = [[NSArray alloc]initWithObjects:@"like21", @"like22", subArray2 ,nil];
[sampleArray addObject:obj2];

    MyClass *obj3=[[MyClass alloc]init];
    obj3.name=@"Mike";
    obj3.countOpen=6;

    obj3.hobbies = [[NSArray alloc]initWithObjects:obj1 , obj2 ,@"likes000", nil];
    [sampleArray addObject:obj3];

    //First lets encode it
    NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:sampleArray];
    [userDefault setObject:myEncodedObject forKey:[NSString stringWithFormat:@"sample"]];
    [userDefault synchronize];

    //Lets decode it now
    NSData *myDecodedObject = [userDefault objectForKey: [NSString stringWithFormat:@"sample"]];
    NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject];

    //Print the array received from User's Default 
    for (MyClass *item in decodedArray) {

        NSLog(@"name=%@",item.name);
        NSLog(@"LIKES TO %@",item.hobbies);
    }

    }

这是我确认 NSCoding 协议的自定义类

- (void)encodeWithCoder:(NSCoder *)encoder
{

    //Encode properties, other class variables, etc
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:[NSNumber numberWithInt:self.countOpen] forKey:@"destinationCode"];
    [encoder encodeObject:self.hobbies forKey:@"likesTo"];

}

- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if( self != nil )
    {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.countOpen = [[decoder decodeObjectForKey:@"countOpen"] intValue];
        self.hobbies = [decoder decodeObjectForKey:@"likesTo"];
    }
    return self;
}

这是输出:-

2013-10-22 17:01:47.118 Sample[1056:c07] name=Reetu
2013-10-22 17:01:47.120 Sample[1056:c07] LIKES TO (
    like11,
    like12,
        (
        likes131,
        likes132,
        likes133
    )
)
2013-10-22 17:01:47.121 Sample[1056:c07] name=Pinku
2013-10-22 17:01:47.123 Sample[1056:c07] LIKES TO (
    like21,
    like22,
         (
         "<MyClass: 0x6e32910>",
         likes231,
        likes232,
        likes233,
        "<MyClass: 0x6e32910>"
     )
 )
 2013-10-22 17:01:47.125 Sample[1056:c07] name=Mike
 2013-10-22 17:01:47.127 Sample[1056:c07] LIKES TO (
    "<MyClass: 0x6e32910>",
    "<MyClass: 0x6e1f610>",
    likes000
 )

问题是&lt;MyClass: 0X632910&gt;。我期待它是 obj1 本身的内容。

【问题讨论】:

  • 真正的问题是什么?
  • 检查输出。问题是“”。我期待它是 obj1 的内容 ...
  • 请不要使用大写,它对应于喊。为什么你认为我们知道你的期望?
  • 对不起!但我希望你明白我想要什么?
  • 当您告诉我们您的期望时,我想我明白了。我在下面发布了答案。

标签: iphone ios nsuserdefaults object-persistence


【解决方案1】:

问题不在于 NSUserDefaults。这与您打印信息的方式有关:

你应该覆盖-(NSString*) description,可能是这样的:

-(NSString*) description
{
    return [NSString stringWithFormat:@"<%@ - name:%@ open:%d>", self.class self.name, self.countOpen];
}

【讨论】:

    【解决方案2】:

    您没有像将元素添加到数组中那样记录方式。您正在向第二个数组添加一个 MyClass 对象,但您希望它的爱好 NSArray 被打印出来。

    像这样更改您的日志记录功能。它将正确打印直到第二个对象。对于第三个对象,您必须在函数中编写另一个 for 循环。因为您的对象层次结构就是这样。

    for (MyClass *item in decodedArray) {
    
        NSLog(@"name=%@",item.name);
    
        if ([item.technologies isKindOfClass:[MyClass class]]) {
            for (MyClass *item in arr) {
                NSLog(@"name=%@",item.name);
                NSLog(@"LIKES TO %@",item.hobbies);
             }
        }
        else{
            NSLog(@"LIKES TO %@",item.hobbies);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 2011-01-19
      • 2011-02-28
      • 2011-05-10
      相关资源
      最近更新 更多