Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 尝试从AFHTTPClient反序列化子类对象时执行错误访问_Objective C_Nsuserdefaults_Exc Bad Access_Afnetworking_Nscoding - Fatal编程技术网

Objective c 尝试从AFHTTPClient反序列化子类对象时执行错误访问

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

我有一个子类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"];
两件事:

  • 使用钥匙链而不是
    NSUserDefaults
    ,来存储凭据
  • 不要乱动
    NSCoding
    ,只需覆盖
    -initWithBaseURL
    ,(当然要确保调用
    super
    ),并根据存储在密钥链中的值(如果存在)设置
    授权
    头。
    isLoggedIn
    属性可以(也应该)定义为派生的
    只读
    属性,当
    授权
    标题存在时,该属性返回
    ,否则返回

我照你写的做了,现在一切正常。问题是,当我第一次看到AFHTTPClient符合时,我认为使用它的正确方法是序列化/反序列化整个客户端。