0

所以我有这个定制的课程:

LocationSupplementaryObject.h:

@interface LocationSupplementaryObject : NSObject <NSCoding>

@property (nonatomic) NSString* storedPlaceName;

-(id)initWithLocationName:(NSString*)locationName;
-(void)encodeWithCoder:(NSCoder*)encoder;
-(id)initWithCoder:(NSCoder*)decoder;

- (void)saveCustomObject:(LocationSupplementaryObject *)object key:(NSString *)key;
- (LocationSupplementaryObject *)loadCustomObjectWithKey:(NSString *)key;
@end

LocationSupplementaryObject.m:

@implementation LocationSupplementaryObject

- (id)initWithLocationName:(NSString *)locationName
{
    self = [super init];
    if (self) {
        self.storedPlaceName = locationName;
        NSLog(@"Initialization success! Name is %@",self.storedPlaceName);
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)encoder {
    // Encode the properties of the object
    [encoder encodeObject:self.storedPlaceName forKey:@"stored_placeName"];
}

-(id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self) {
        // Decode properties for the object
        self.storedPlaceName = [decoder decodeObjectForKey:@"stored_placeName"];
    }
    return self;
}

- (void)saveCustomObject:(LocationSupplementaryObject *)object key:(NSString *)key {
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:encodedObject forKey:key];
    [defaults synchronize];

}

- (LocationSupplementaryObject *)loadCustomObjectWithKey:(NSString *)key {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *encodedObject = [defaults objectForKey:key];
    LocationSupplementaryObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
    return object;
}

@end

所以稍后在我的程序中,我使用LocationSupplementaryObject类:

LocationSupplementaryObject *suppObject = [[LocationSupplementaryObject alloc]initWithLocationName:[object objectForKey:(NSString*)kCCName]];

//  Writing the object to defaults

    [suppObject saveCustomObject:suppObject key:@"StoredLocation"];
    NSLog(@"%@ Successfully packed",suppObject.storedPlaceName);

    LocationSupplementaryObject *newObject = [[LocationSupplementaryObject alloc]init];
    [newObject loadCustomObjectWithKey:@"StoredLocation"];
    NSLog(@"Re initializing from defaults %@",newObject.storedPlaceName);

为了初始化名称,我使用从 parse.com 加载的对象,我们可以看到通过 NSLog 消息正确设置了 suppObject.storedPlaceName。但是,从 NSUserDefaults 检索和取消归档的名称结果是(null),我知道 NSUserDefaults 可能很慢,即使我们调用了同步,所以我正在检查程序另一端的对象:

LocationSupplementaryObject *suppObject = [[LocationSupplementaryObject alloc]init];
[suppObject loadCustomObjectWithKey:@"StoredLocation"];
if (suppObject) {
NSLog(@"We got our name %@",suppObject.storedPlaceName);
}

即使类是用合法的 NSString 初始化的,它仍然向我显示 (null) 存储在 NSUserDefaults 中的名称。我应该承认,我对 NSCoder 没有很多经验,所以任何帮助都将不胜感激。

4

1 回答 1

1

您的加载和保存方法应该是类方法。将它们创建为实例方法意味着您会感到困惑而不是处理返回值。因此,您期望的对象实际上不是。您的编码器代码实际上很好。

于 2015-10-17T17:39:08.210 回答