尝试从AFHTTPClient反序列化子类对象时EXC_BAD_ACCESS

时间:2013-04-17 10:57:24

标签: 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)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"];

1 个答案:

答案 0 :(得分:1)

两件事:

  • 使用钥匙串而不是NSUserDefaults来存储凭据。
  • 而不是弄乱NSCoding,只需覆盖-initWithBaseURL,(当然确保调用super),并根据存储的值设置Authorization标头在钥匙串中(如果存在)。 isLoggedIn属性可以(并且应该)定义为派生readonly属性,当YES标头存在时返回Authorization,否则返回NO