You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:45:33