Trả lời

12

Để chuyển đổi một mảng chung thành NSData, bạn cần một bộ lưu trữ! Nếu bạn biết cách nạp NSData, bạn biết cách sử dụng NSKeyedArchiver. Vì vậy:

NSArray* array= ... ; 
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array]; 

Tất nhiên tất cả các yếu tố trong array nhu cầu của bạn để thực hiện encodeWithCoder:.

+4

Để hoàn thành, bạn sử dụng NSKeyedUnarchiver để làm ngược lại. –

+0

"tất cả các phần tử trong mảng của bạn cần triển khai encodeWithCoder:" <- điều này chỉ cần thiết cho các đối tượng tùy chỉnh? –

+0

tất cả các phần tử trong mảng của bạn cần phải thực hiện 'encodeWithCoder:', hoặc bởi Apple hoặc bởi bạn. Bạn có thể kiểm tra xem một đối tượng do Apple cung cấp có triển khai thực hiện hay không bằng cách xem tài liệu chính thức ... xem nó có thực hiện giao thức 'NSCoder' hay không. – Yuji

13

Câu trả lời của Yuji là đúng. nhưng chính xác hơn, yếu tố bạn của một mảng phải thực hiện giao thức và FILLIN mã của riêng bạn với các phương pháp initWithCoder: và encodeWithCoder: như:

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

sau đó bạn có thể sử dụng Archiver và unchariver như:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes]; 
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"]; 

NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"]; 
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData]; 

Để biết thêm, bạn có thể tham khảo "Archiving Objective-C Objects with NSCoding".

Các vấn đề liên quan