[英]NSUserDefaults and Conditional Encoding of Custom Objects in an NSArray
[英]Storing a NSArray of my Custom Objects in NSUserDefaults
該要求是,我要存儲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
)
問題是<MyClass: 0X632910>
。 我期待它是obj1
本身的內容。
問題不在於NSUserDefaults。 這是你如何打印信息:
你應該覆蓋-(NSString*) description
,可能是這樣的:
-(NSString*) description
{
return [NSString stringWithFormat:@"<%@ - name:%@ open:%d>", self.class self.name, self.countOpen];
}
您沒有像將數組添加到數組一樣記錄方式。 您正在向第二個數組添加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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.