Is the parameter for NSKeyedArchiver archivedDataWithRootObject: supposed to be the array I am trying to save, or the array converted into NSData?
Asked
Active
Viewed 1.8k times
2 Answers
16
Yuji's answer is right. but more accurately, your element of an array have to implement protocol and fillin your own code to methods initWithCoder: and encodeWithCoder: like:
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.title = [decoder decodeObjectForKey:@"title"];
self.author = [decoder decodeObjectForKey:@"author"];
self.published = [decoder decodeBoolForKey:@"published"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:title forKey:@"time"];
[encoder encodeObject:author forKey:@"author"];
[encoder encodeBool:published forKey:@"published"];
}
then you can use the archiver and unchariver like:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"];
NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];
For more, you can get reference "Archiving Objective-C Objects with NSCoding".

Jeromy French
- 11,812
- 19
- 76
- 129

Bruce Lee
- 4,177
- 3
- 28
- 26
14
To convert a generic array to an NSData
, you need an archiver! If you know how to feed the NSData
, you know how to use NSKeyedArchiver
. So:
NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];
Of course all elements in your array
needs to implement encodeWithCoder:
.

Yuji
- 34,103
- 3
- 70
- 88
-
4For completeness, you use an NSKeyedUnarchiver to do the reverse. – Tristan Warner-Smith Jan 12 '11 at 09:07
-
"all elements in your array needs to implement encodeWithCoder:" <-- this is only needed for custom objects? – Just a coder Nov 07 '13 at 01:28
-
all elements in your array need to have an implementation of `encodeWithCoder:`, either by Apple or by you. You can check if an Apple-supplied object implements it or not by having a look at the official documentation... see if it implements the protocol `NSCoder`. – Yuji Nov 08 '13 at 04:57