Сбой iOS внутри блока - PullRequest
       22

Сбой iOS внутри блока

0 голосов
/ 04 января 2019

Вот код, который начинается здесь:

[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?

Любая идея будет принята с благодарностью.

---------- (Редактировать 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];
    }];
}];

Теперь сбоя не произойдет, но мне все еще интересно, какова реальная причина и другие решения.

...