这是代码,从这里开始:
[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
?
任何想法都将不胜感激。
----------(编辑1st)
这是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);
}];
}
----------(编辑2nd)
崩溃似乎可以通过创建一个临时变量来解决。这是代码:
[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];
}];
}];
现在不会发生崩溃,但是我仍然想知道真正的原因和其他解决方案。