The requirement is that I want to store NSArray of my custom objects in NSUserDefaults. Following is the code from my example

- (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);
    }

    }

This is my custom class confirming to the NSCoding protocol

- (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;
}

here is the output:-

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
 )

The problem is <MyClass: 0X632910>. I was expecting it to be contents of obj1 itself.

有帮助吗?

解决方案

The problem isn't with NSUserDefaults. It's with how you are printing the information out:

You should override -(NSString*) description, probably to read something like this:

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

其他提示

You are not logging the way like you are adding the elements to the array. You are adding a MyClass object to the second array but you are expecting its hobbies NSArray to be printed.

Change your logging function like this. It will print corretly until the second object. For the third object you have to write another for loop in the function. Because your object hierarchy is like that.

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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top