2

私のアプリでは、myObject を NSData にアーカイブしてから、NSData をアーカイブ解除して myObject を取得します。クラッシュトレース

0   CoreFoundation                  0x2fe9ef46 __exceptionPreprocess + 126
1   libobjc.A.dylib                 0x3a1b36aa objc_exception_throw + 34
2   CoreFoundation                  0x2fe9ee88 +[NSException raise:format:] + 100
3   Foundation                      0x30815098 -[NSKeyedUnarchiver initForReadingWithData:] + 2464
4   Foundation                      0x30814680 +[NSKeyedUnarchiver unarchiveObjectWithData:] + 48

MyObject には次のプロパティが含まれています。

@property (nonatomic,strong) NSData * imageData;
@property (nonatomic,strong) NSData * thumbnailData;
@property (nonatomic,strong) NSString * imagePath;
@property (nonatomic,strong) NSString * thumnailPath;
@property (nonatomic,strong) NSString * documentIdentifier;
@property (nonatomic,strong) NSString *paperIdentifier;

NSData のアーカイブを解除しようとすると、このクラッシュが発生しました。

NSData ==> OS_dispatch_data (138693 バイト)。

[NSKeyedUnarchiver unarchiveObjectWithData:documentData] を使用してアーカイブを解除し、myobject クラスでこれらのメソッドを実装します。

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:self.imageData forKey:IMAGE_DATA_KEY];
    [coder encodeObject:self.thumbnailData forKey:THUMBNAIL_DATA_KEY];
    [coder encodeObject:self.imagePath forKey:IMAGE_PATH_KEY];
    [coder encodeObject:self.thumnailPath forKey:THUMNBAIL_PATH_KEY];
    [coder encodeObject:self.paperIdentifier forKey:PAPER_ID_KEY];
    [coder encodeObject:self.documentIdentifier forKey:DOCUMENT_ID_KEY];
}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self) {
        self.imageData = [coder decodeObjectForKey:IMAGE_DATA_KEY];
        self.thumbnailData = [coder decodeObjectForKey:THUMBNAIL_DATA_KEY];
        self.imagePath = [coder decodeObjectForKey:IMAGE_PATH_KEY];
        self.thumnailPath = [coder decodeObjectForKey:THUMNBAIL_PATH_KEY];
        self.paperIdentifier = [coder decodeObjectForKey:PAPER_ID_KEY];
        self.documentIdentifier = [coder decodeObjectForKey:DOCUMENT_ID_KEY];

    }
    return self;
}

誰でも私を助けてくれますか?

4

1 に答える 1

0

カスタムオブジェクトを設定および取得するには、これらを使用します...

+ (void)saveCustomObject:(YourClass *)obj {
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:obj];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myEncodedObject forKey:@"key"];
}

+ (YourClass *)loadCustomObjectWithKey:(NSString *)key {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *myEncodedObject = [defaults objectForKey:key];
YourClass *obj = (YourClass *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
return obj;
}
于 2014-04-07T13:06:49.027 に答える