Alexandr Hotko
Alexandr Hotko

Reputation: 83

VNSequenceRequestHandler VNTrackRectangleRequest iOS16 limit error

On iOS 15 and lower all good, issue appear only on 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);
            }
        }
    }
}

It's appear for 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}

No memory leak detected by Instruments.

EDITED

I fix it in my way, maybe it help someone. iOS 16 don't release VNSequenceRequestHandler after nil it, you need performRequests with new VNTrackRectangleRequest.lastFrame = YES; on it.

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

Upvotes: 2

Views: 439

Answers (0)

Related Questions