NSString 在时间之前释放
NSString is realeased before time
我正在我的应用程序中使用 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
知道如何解决这个已发布的问题吗?我在我的项目中使用非 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];
我正在我的应用程序中使用 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
知道如何解决这个已发布的问题吗?我在我的项目中使用非 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];