2009-11-02 38 views
14

Tôi gặp sự cố khi chuyển đổi NSObject thành NSData. Tôi có một lớp học kế thừa NSObject.Chuyển đổi NSObject thành NSData

Khi tôi đã cố gắng để chuyển đổi đối tượng mà lớp học đặc biệt vào NSData như sau:

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

nhưng nó mang lại cho ra ngoại lệ nói rằng -[classObject encodeWithCoder:]: chọn không được công nhận gửi đến dụ ..

Tôi cũng đã thêm đối tượng vào một mảng mới được tạo thành là

NSMutableArray *wrapperedData = [NSMutableArray arrayWithObject: classObject]; 
NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:value]; 

Nhưng vẫn còn, ngoại lệ của nó.

Vì vậy, tôi cần trích xuất các byte từ đối tượng classObject.

Bất kỳ trợ giúp sẽ được đánh giá cao ...

chờ trả lời của bạn ...

Trả lời

5

bạn có thể đối tượng chỉ lưu trữ hỗ trợ giao thức NSCoding

7

Bạn cần phải thực hiện encodeWithCoder: trên của bạn lớp tùy chỉnh, tuần tự hóa tất cả các thuộc tính của nó bằng cách sử dụng NSCoder được truyền vào nó. Nếu các thuộc tính của nó bao gồm bất kỳ lớp tùy chỉnh nào khác, chúng sẽ cần encodeWithCoder: thực hiện quá.

6

Thay vì

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

nó phải được

NSData *dataOnObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"]; 

Nhưng đó chỉ cho đọc dữ liệu trong đó đã được lưu. Nếu bạn muốn lưu một đối tượng dưới dạng NSData thì bạn có điều này:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:classObject] forKey:@"someKey"]; 

Nhưng đó không phải là tất cả. ClassObject của bạn phải thực hiện giao thức NSCoding và có hai phương thức encodeWithCoder: và initWithCoder: vì nó không phải là một đối tượng NS để nó hoạt động.

+0

Tại sao điều này lại bị giảm giá? lol. –

+1

(Tôi không downvote bạn) Có lẽ đó là bởi vì NSKeyedUnarchiver không bản đồ để NSUserDefaults ... – CodaFi

+3

Tại sao khái niệm này được tham gia với NSUserDefaults –

21

Bạn phải thực hiện cho đối tượng riêng của bạn như:

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.name forKey:@"name"]; 
    [aCoder encodeInt:self.age forKey:@"age"]; 
    [aCoder encodeObject:self.email forKey:@"email"]; 
    [aCoder encodeObject:self.password forKey:@"password"]; 
} 
BOOL success = [NSKeyedArchiver archiveRootObject:person toFile:archiveFilePath]; 

và:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.age = [aDecoder decodeIntForKey:@"age"]; 
     self.email = [aDecoder decodeObjectForKey:@"email"]; 
     self.password = [aDecoder decodeObjectForKey:@"password"]; 
    } 
    return self; 
} 
Person *unarchivePerson = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveFilePath]; 
0

Đây là một ví dụ về đối tượng tùy chỉnh được chuyển đổi thành NSData (vì vậy nó có thể được lưu vào mặc định của người dùng)

Tạo các tệp sau:

Danh mục.h

@interface Catalog : NSObject 

@property (nonatomic, assign) int pk; 
@property (nonatomic, copy) NSString *catalogName; 
@property (nonatomic, copy) NSString *catalogDescription; 
@property (nonatomic, assign) int catalogEdition; 
@property (nonatomic, assign) int catalogTotalPages; 

- (void)encodeWithCoder:(NSCoder *)aCoder; 
- (id)initWithCoder:(NSCoder *)aDecoder; 

@end 

Catalog.m

#import <Foundation/Foundation.h> 
#import "Catalog.h" 

@implementation Catalog 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:self.catalogName forKey:@"catalogName"]; 
    [aCoder encodeObject:self.catalogDescription forKey:@"catalogDescription"]; 
    [aCoder encodeInt:self.catalogEdition forKey:@"catalogEdition"]; 
    [aCoder encodeInt:self.catalogTotalPages forKey:@"catalogTotalPages"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.catalogName = [aDecoder decodeObjectForKey:@"catalogName"]; 
     self.catalogDescription = [aDecoder decodeObjectForKey:@"catalogDescription"]; 
     self.catalogEdition = [aDecoder decodeIntForKey:@"catalogEdition"]; 
     self.catalogTotalPages = [aDecoder decodeIntForKey:@"catalogTotalPages"]; 
    } 
    return self; 
} 

@end 

file Cuối cùng trong điều khiển của bạn bao gồm tiêu đề

#import "Catalog.h" 

Và thêm mã này vào sử dụng đối tượng của bạn (trong trường hợp này im tiết kiệm vào giá trị mặc định người dùng)

  Catalog *catalog = [[Catalog alloc] init]; 
      catalog.catalogName = @"catalogName"; 
      catalog.catalogDescription = @"catalogName"; 
      catalog.catalogEdition = 1; 

Chú ý: trong dòng mã này là nơi mà các dữ liệu đi qua thực tế đang diễn ra

//archiving object to nsdata 
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:catalog]; 

[[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:@"keyName"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

Trong trường hợp bạn muốn nhận đối tượng của bạn trở lại từ NSData

NSData *nsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"]; 
//unarchiving object to nsdata 
Catalog *selectedCatalog = [NSKeyedUnarchiver unarchiveObjectWithData: nsData]; 

Hope this helps!

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