0

I'm trying to add text widgets to my pdf using IOS PDFKIT. So to achieve that goal I'm using the PDFAnnottaion class.

My issue is that after adding multiples annotations (something like 15) my app is facing a big performance issue because of ram usage that is leading to its crash if I add more annotations. This is the error message when my app crashes:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x190f1b22c)
    frame #0: 0x0000000190f1b22c CoreFoundation`CFRelease.cold.1 + 16
CoreFoundation`CFRelease.cold.1:
->  0x190f1b22c <+16>: brk    #0x1
CoreFoundation`__CFStringCollectionCopy.cold.1:
    0x190f1b230 <+0>:  adrp   x8, 347691
    0x190f1b234 <+4>:  adrp   x9, 482
    0x190f1b238 <+8>:  add    x9, x9, #0xab2            ; =0xab2
Target 0: (Runner) stopped.

The error message make me think that the error is memory related but I'm not sure.

Below you will be able to find the code I'm using to create and add my annotation :

    CGSize newSize = CGSizeMake(_pointer.size.width * pointerScale,_pointer.size.height * pointerScale);
    
    CGRect parentRect = _pdfView.bounds;;
    
    double x = parentRect.size.width / [observation.xScale doubleValue] ;
    double y = parentRect.size.height / [observation.yScale doubleValue];

    PDFAnnotation * observationText =  [[PDFAnnotation alloc] initWithBounds:CGRectMake(x + newSize.width /2 ,y + newSize.height /2 ,10, 10) forType: PDFAnnotationSubtypeText withProperties: nil];;
    
     observationText.contents = [NSString stringWithFormat:@"%@", observation.observationId];
     observationText.fontColor = UIColor.blackColor;
     observationText.color = UIColor.clearColor;
    
     if(_pdPage != nil){
         [_pdPage addAnnotation:observationText];
         observation.textAnnotation = observationText;
     }

This is how I load my pdf :


 if ([filePath isKindOfClass:[NSString class]]) {
            NSURL * sourcePDFUrl = [NSURL fileURLWithPath:filePath];
            PDFDocument * document = [[PDFDocument alloc] initWithURL: sourcePDFUrl];

            if (document == nil) {
              NSLog(@"cannot create document: File not in PDF format or corrupted.");
            } else {
                _pdfView.autoresizesSubviews = YES;
                _pdfView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
                _pdfView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
                _pdfView.displayDirection = kPDFDisplayDirectionVertical;
                _pdfView.displayMode = kPDFDisplaySinglePage;
                _pdfView.document = document;
                
                PDFPage* page = [document pageAtIndex:0];
                _pdPage = page;
                UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action: @selector(onTap:)];
                UILongPressGestureRecognizer * longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action: @selector(longPress:)];

                tapGesture.numberOfTapsRequired = 1;
                tapGesture.numberOfTouchesRequired = 1;
                
                [_pdfView addGestureRecognizer:tapGesture];
                [_pdfView addGestureRecognizer:longPressGesture];

                movedObservation = nil;
                [_pdfView goToPage: page];

                CGRect pageRect = [page boundsForBox:[_pdfView displayBox]];
                CGRect parentRect = [[UIScreen mainScreen] bounds];

                if (frame.size.width > 0 && frame.size.height > 0) {
                    parentRect = frame;
                }

                CGFloat scale = 1.0f;
                if (parentRect.size.width / parentRect.size.height >= pageRect.size.width / pageRect.size.height) {
                    scale = parentRect.size.height / pageRect.size.height;
                } else {
                    scale = parentRect.size.width / pageRect.size.width;
                }

                NSLog(@"scale %f", scale);

                _pdfView.scaleFactor = scale;
                _pdfView.minScaleFactor = scale;
                _pdfView.maxScaleFactor = 4.0;
                for(Observation * observation in _observations) {
                    [self drawObservation:observation];
                }
            }
        }

So does someone has an idea why I'm facing this performance issues ? Am I initializing the wrong way my annotations ?

Michel Melhem
  • 551
  • 1
  • 8
  • 22
  • The code you have provided seems ok. Although PDFKit has always had memory issues because it loads entire pdf fiel in memory, you can try to check if your issue is memory related by checking if `didReceiveMemoryWarning` gets called (in which case you can re-load the pdf here and your memory usage should go down), or dig deeper by using memory profiler n your app to see where its piling up. Also, share more of your code related to opening, the pdf itself, etc. – Swapnil Luktuke Feb 11 '21 at 22:35
  • there have been reported issues with PDFKit's memory usage before: check [1](https://stackoverflow.com/questions/51709014/searching-in-pdfs-increases-apps-memory-usage-too-much), [2](https://stackoverflow.com/questions/48957766/pdfkit-memory-issues-ios12), [3](https://developer.apple.com/forums/thread/93589). There are many more if you search. – Swapnil Luktuke Feb 11 '21 at 22:38
  • @SwapnilLuktuke Yes but my performance issue is occurring after adding multiples annotations.Most people are experiencing issues because of a large pdf file; Also I added more code to my post if that could help – Michel Melhem Feb 13 '21 at 09:09

0 Answers0