NSString выпущен раньше времени - PullRequest
1 голос
/ 03 мая 2020

Я использую WKWebView в своем приложении для получения данных от HTML с javascript, я использую этот код:

NSString *jsCall = [NSString stringWithFormat:@"xxxxxx('%@');",html];

__block NSString *searchJson = nil;

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_sync(dispatch_get_main_queue(), ^{
    [self.searchWebView evaluateJavaScript:jsCall completionHandler:^(id result, NSError * _Nullable error) {
        if (error || result == nil || ![result isKindOfClass:[NSString class]]) {
            searchJson = nil;
        } else {
            searchJson = result;
        }

        dispatch_semaphore_signal(semaphore);
    }];
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

if ([NSString stringIsNilOrEmpty:searchJson]) {
    return nil;
}

return [self getResultsWithJSonString:searchJson];

Мне нужно дождаться ответа, чтобы Я использую метод semaphore_wait, он работает нормально, но иногда searchJson высвобождается из памяти, и в [NSString stringIsNilOrEmpty:searchJson] я получаю эту ошибку:

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000443439e70

Любая идея о том, как исправить эту проблему? Я использую Non-AR C в своем проекте.

1 Ответ

1 голос
/ 03 мая 2020

Если это не AR C, вы должны явно сохранить результат (потому что обратный вызов может быть в другом потоке), например

} else {
    searchJson = [result retain];
}

, а затем, чтобы избежать утечки, используйте

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[searchJson autorelease]; // << call it here, once !!

if ([NSString stringIsNilOrEmpty:searchJson]) {
    return nil;
}

return [self getResultsWithJSonString:searchJson];
...