2015-10-17 80 views
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 *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加载,我们可以看到,suppObject.storedPlaceName设置正确低谷NSLog的消息。 但是,名称检索和取消从NSUserDefaults的结果是(空),我知道NSUserDefaults的可能比较缓慢,即使我们称之为同步,所以我在程序的另一侧检查对象:

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

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

回答

1

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

+0

我试过这种语法来检索默认名称,它的工作原理!谢谢! LocationSupplementaryObject * suppObject = [[LocationSupplementaryObject alloc] loadCustomObjectWithKey:@“StoredLocation”]; –

相关问题