Objective c 尝试从AFHTTPClient反序列化子类对象时执行错误访问
我有一个子类AFHTTPClient,实现了NSCoding协议方法:Objective c 尝试从AFHTTPClient反序列化子类对象时执行错误访问,objective-c,nsuserdefaults,exc-bad-access,afnetworking,nscoding,Objective C,Nsuserdefaults,Exc Bad Access,Afnetworking,Nscoding,我有一个子类AFHTTPClient,实现了NSCoding协议方法: - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (!self) return nil; self.isLoggedIn = [aDecoder decodeBoolForKey:@"isLoggedIn"]; return self; } - (void)encodeWit
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (!self)
return nil;
self.isLoggedIn = [aDecoder decodeBoolForKey:@"isLoggedIn"];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[super encodeWithCoder:aCoder];
[aCoder encodeBool:self.isLoggedIn forKey:@"isLoggedIn"];
}
我还实现了为令牌设置默认头的方法&在那里我归档了客户端:
- (void)setAuthorizationHeaderWithToken:(NSString *)token {
[self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"OAuth %@", token]];
[self setIsLoggedIn:YES];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:kGCClient];
[[NSUserDefaults standardUserDefaults] synchronize];
}
我在我的子类中的-(id)initWithBaseURL:(NSURL*)url
实现中反序列化客户机:
- (id)initWithBaseURL:(NSURL *)url {
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kGCClient];
GCClient *client = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (client)
return self = client;
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self setIsLoggedIn:NO];
return self;
}
问题是,一旦我登录,下一次打开应用程序时,它会在AFHTTPClient
类-(id)initWithCoder:(NSCoder*)aDecoder
方法中对客户机的反序列化进行破坏,在第一次尝试解码对象时,在调试器中它会说返回的值不是Objective-C对象
NSURL *baseURL = [aDecoder decodeObjectForKey:@"baseURL"];
两件事:
- 使用钥匙链而不是
,来存储凭据NSUserDefaults
- 不要乱动
,只需覆盖NSCoding
,(当然要确保调用-initWithBaseURL
),并根据存储在密钥链中的值(如果存在)设置super
头。授权
属性可以(也应该)定义为派生的isLoggedIn
属性,当只读
标题存在时,该属性返回授权
,否则返回是
李>否