AFURLSessionManager 当我的 ViewController 导航应用程序崩溃时
AFURLSessionManager when my ViewController was navigated app crashed
我在 Objective-C iOS 的 AFURLSessionManager 中遇到问题。我有 2 viewController 并使用 AFURLSessionManager 从服务器获取数据。
当用户导航到具有 AFURLSessionManager 请求的 viewContoller2 并且用户的网络非常糟糕并按下后退按钮时,AFURLSessionManager 想要调用委托,崩溃并显示 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)
当我导航到 viewController 时,AFURLSessionManager 任务完成延迟并且 viewController 已被用户更改并且 AFURLSessionManager 尝试调用内存中不存在的委托。
有人知道解决这个问题吗?
这是请求代码:
- (void) getData
{
NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"http://----------" parameters:nil error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
req.timeoutInterval= 15;
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
self.dataTask = [manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error)
{
if (!error)
{
NSLog(@"Reply JSON >>>>>> responseObject <<<<<: %@", responseObject);
if ([responseObject isKindOfClass:[NSDictionary class]])
{
if (self.delegate && [self.delegate respondsToSelector:@selector(success:)]) {
[self.delegate success:responseObject];
}
// self.colorView.backgroundColor = [UIColor blueColor];
return;
}
else
{
NSLog(@"Error No dictionary: %@, %@, %@", error, response, responseObject);
{
// self.colorView.backgroundColor = [UIColor redColor];
[self.delegate error:error];
return;
}
}
}
else
{
NSLog(@"Error: %@, %@, %@", error, response, responseObject);
[self.delegate error:error];
return;
}
}];
[self.dataTask resume];
if (self.cancelRequest) {
[self.dataTask cancel];
}
}
头文件:
@protocol WebServicesDelegate <NSObject>
- (void) success:(NSDictionary *) dic;
- (void) error:(NSError *) error;
@end
@interface WebServices : NSObject
@property (assign,nonatomic) id<WebServicesDelegate> delegate;
@property (nonatomic) BOOL cancelRequest;
-(void) setCancelRequest:(BOOL)cancelRequest;
//+(instancetype) shareInstance;
- (void) getData;
@end
提前致谢
调试 self.delegate 是什么。它绝对不是零,否则它不会崩溃。
它崩溃了,因为 self.delegate 不是 NSObject 的子类。它要么是标量,要么是一些垃圾值。
我猜你在声明委托时使用了 assign
而不是 weak
,因为它已被分配,所以它导致了一个悬空指针。
编辑(问题更新后)
变化
@property (assign,nonatomic) id<WebServicesDelegate> delegate;
到
@property (weak,nonatomic) id<WebServicesDelegate> delegate;
问题可能与 self
有关,因为您的 webservice
是异步的,所以当响应到来时,您已经通过 pop 或 dismiss
删除了 viewcontroller
你应该使用__weak typeof(self) weakSelf = self;
并在self
处使用weakSelf
希望对解决您的问题有所帮助
我在 Objective-C iOS 的 AFURLSessionManager 中遇到问题。我有 2 viewController 并使用 AFURLSessionManager 从服务器获取数据。
当用户导航到具有 AFURLSessionManager 请求的 viewContoller2 并且用户的网络非常糟糕并按下后退按钮时,AFURLSessionManager 想要调用委托,崩溃并显示 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)
当我导航到 viewController 时,AFURLSessionManager 任务完成延迟并且 viewController 已被用户更改并且 AFURLSessionManager 尝试调用内存中不存在的委托。
有人知道解决这个问题吗?
这是请求代码:
- (void) getData
{
NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"http://----------" parameters:nil error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
req.timeoutInterval= 15;
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
self.dataTask = [manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error)
{
if (!error)
{
NSLog(@"Reply JSON >>>>>> responseObject <<<<<: %@", responseObject);
if ([responseObject isKindOfClass:[NSDictionary class]])
{
if (self.delegate && [self.delegate respondsToSelector:@selector(success:)]) {
[self.delegate success:responseObject];
}
// self.colorView.backgroundColor = [UIColor blueColor];
return;
}
else
{
NSLog(@"Error No dictionary: %@, %@, %@", error, response, responseObject);
{
// self.colorView.backgroundColor = [UIColor redColor];
[self.delegate error:error];
return;
}
}
}
else
{
NSLog(@"Error: %@, %@, %@", error, response, responseObject);
[self.delegate error:error];
return;
}
}];
[self.dataTask resume];
if (self.cancelRequest) {
[self.dataTask cancel];
}
}
头文件:
@protocol WebServicesDelegate <NSObject>
- (void) success:(NSDictionary *) dic;
- (void) error:(NSError *) error;
@end
@interface WebServices : NSObject
@property (assign,nonatomic) id<WebServicesDelegate> delegate;
@property (nonatomic) BOOL cancelRequest;
-(void) setCancelRequest:(BOOL)cancelRequest;
//+(instancetype) shareInstance;
- (void) getData;
@end
提前致谢
调试 self.delegate 是什么。它绝对不是零,否则它不会崩溃。
它崩溃了,因为 self.delegate 不是 NSObject 的子类。它要么是标量,要么是一些垃圾值。
我猜你在声明委托时使用了 assign
而不是 weak
,因为它已被分配,所以它导致了一个悬空指针。
编辑(问题更新后) 变化
@property (assign,nonatomic) id<WebServicesDelegate> delegate;
到
@property (weak,nonatomic) id<WebServicesDelegate> delegate;
问题可能与 self
有关,因为您的 webservice
是异步的,所以当响应到来时,您已经通过 pop 或 dismiss
你应该使用__weak typeof(self) weakSelf = self;
并在self
weakSelf
希望对解决您的问题有所帮助