iOS16下VNSequenceRequestHandler调用VNTrackRectangleRequest遇跟踪器超限错误
iOS 16下VNSequenceRequestHandler触发跟踪器数量超限错误
该代码在iOS 15及更低版本运行正常,仅在iOS 16中出现异常。
复现问题的测试代码
+ (void)load { // test image with rect CIImage * image = [ [ CIImage alloc ] initWithData:[ NSData dataWithContentsOfURL:[ NSURL URLWithString:@"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSSZRebToiMqFCochj1CzIQws9HSFhjrihw0g&usqp=CAU" ] ] ]; for (int i = 0; i < 1000; i++) { @autoreleasepool { VNSequenceRequestHandler * sequenceRequestHandler = [ [ VNSequenceRequestHandler alloc ] init ]; __block VNRectangleObservation * lastObservation = nil; VNDetectRectanglesRequest * detectRequest = [ [ VNDetectRectanglesRequest alloc ] initWithCompletionHandler:^(VNRequest * request, NSError * error) { lastObservation = request.results.firstObject; } ]; [ sequenceRequestHandler performRequests:[ NSArray arrayWithObject:detectRequest ] onCIImage:image error:nil ]; VNTrackRectangleRequest * trackRequest = [ [ VNTrackRectangleRequest alloc ] initWithRectangleObservation:lastObservation completionHandler:nil ]; NSError * error = nil; [ sequenceRequestHandler performRequests:[ NSArray arrayWithObject:trackRequest ] onCIImage:image error:&error ]; if (error) { NSLog(@"error at %d", i); } } } }
错误触发情况
当循环执行到i==16时触发错误,错误信息如下:
Error Domain=com.apple.vis Code=9 "Internal error: Exceeded maximum allowed number of Trackers for a tracker type: VNRectangleTrackerType" UserInfo={NSLocalizedDescription=Internal error: Exceeded maximum allowed number of Trackers for a tracker type: VNRectangleTrackerType}
排查情况
使用Instruments工具未检测到内存泄漏。
修复方案(自行解决)
iOS 16中VNSequenceRequestHandler置空后不会自动释放跟踪器,需要执行设置了lastFrame = YES的新VNTrackRectangleRequest来释放资源,代码如下:
if (@available(iOS 16.0, *)) { VNTrackRectangleRequest * trackRequest = [ [ VNTrackRectangleRequest alloc ] initWithRectangleObservation:lastObservation ]; trackRequest.lastFrame = YES; requestArray = [ NSArray arrayWithObject:trackRequest ]; [ sequenceRequestHandler performRequests:requestArray onCIImage:[ CIImage new ] error:nil ]; }
内容的提问来源于stack exchange,提问作者Alexandr Hotko
相关产品推荐
相关产品推荐

