iOS崩溃内部块

时间:2019-01-04 12:24:27

标签: ios objective-c objective-c-blocks

这是代码,从这里开始:

[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);
    }
}

这是我的问题:

  1. 崩溃如何以及为什么发生?

  2. 为什么[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];
    }];
}];

现在不会发生崩溃,但是我仍然想知道真正的原因和其他解决方案。

0 个答案:

没有答案