gpt4 book ai didi

ios - NSString在时间之前释放

转载 作者:行者123 更新时间:2023-12-01 21:51:34 26 4
gpt4 key购买 nike

我在我的应用程序中使用WKWebView从带有javascript的HTML获取数据,我正在使用以下代码:

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-ARC。

最佳答案

如果是非ARC,则必须显式保留结果(因为回调可能在不同的线程中),例如

} 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];

关于ios - NSString在时间之前释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61572099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com