Вот код, который начинается здесь:
[XXNetwork postDataWithPath:path parameters:paras progress:nil success:^(id obj) {
...
}failure:^(NSError * _Nonnull error) {
[XXLogger endMark:logID action:^(id<XXTrackObj> trackObj) {
[trackObj setResultCode:[@(error.code) stringValue]];
NSString *errString = [NSString stringWithFormat:@"errorInfo: %@", error]; // Thread 1: EXC_BAD_ACCESS(code=1,address=0x134)
[trackObj setModuleExt:errString];
}];
}];
Программа падает на NSString *error = [NSString stringWithFormat:@"errorInfo: %@", error];
, где я сделал комментарий в коде.Я обнаружил, что error
объект ненормальный, когда я отлаживал.
Метод в XXlogger
выглядит следующим образом:
// XXLogger.m
- (void)endMark:(NSString *)trackID action:(void (^)(id<XXTrackObj> trackObj))block {
XXLogModel *model = [self.trackCache objectForKey:trackID];
if (block) {
block(model);
}
}
Вот мои вопросы:
Как и почему происходит сбой?
Почему сбой не происходит в [trackObj setResultCode:[@(error.code) stringValue]]
, поскольку он также использует объект error
?
Любая идея будет принята с благодарностью.
---------- (Редактировать 1-е)
Вот кодв XXNetwork.m
+ (void)postDataWithPath:(NSString *)path
parameters:(NSDictionary *)paras
progress:(XXProgressBlock)progress
success:(void(^)(id obj))success
failure:(void (^)(NSError *error))failure {
AFHTTPManager *manager = [self sharedHTTPSessionManager];
...
// some configurations for manager
...
[manager POST:url parameters:paras progress:nil success:^(NSURLSessionDataTsk * task, id responseObject) {
success(responseObject);
}failure:^(NSURLSessionDataTsk * task, NSError * error) {
failure(error);
}];
}
---------- (Редактировать 2-е)
Сбой, похоже, решается путем создания временной переменной для ошибки.Вот код:
[XXNetwork postDataWithPath:path parameters:paras progress:nil success:^(id obj) {
...
}failure:^(NSError * _Nonnull error) {
NSError *tmpError = error;
[XXLogger endMark:logID action:^(id<XXTrackObj> trackObj) {
[trackObj setResultCode:[@(tmpError.code) stringValue]];
NSString *errString = [NSString stringWithFormat:@"errorInfo: %@", tmpError]; // Thread 1: EXC_BAD_ACCESS(code=1,address=0x134)
[trackObj setModuleExt:errString];
}];
}];
Теперь сбоя не произойдет, но мне все еще интересно, какова реальная причина и другие решения.