2013-05-23 6 views
0

Перейдя к руководству по программированию 2D кварца и некоторому сообщению на SO, я собрал код для чтения содержимого PDF-файла. Я думаю, что это не так. Когда я иду, чтобы освободить сканер сбоев приложения с этой ошибкой:iOS: Чтение содержимого файла PDF

avi(2282,0x3de7bb88) malloc: *** error for object 0x693f7c0: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Я открываю файл PDF через вложения электронной почты. Я знаю, что это, по крайней мере, распознавание файла, поскольку я могу получить количество страниц. Может ли кто-нибудь посмотреть мой код ниже и посмотреть, где происходит моя ошибка? Благодарю.

- (void) readPDFFile:(NSURL *)PDFURL { 

    //make a pdf document and point it to the url of our pdf file 
    CGPDFDocumentRef pdfDocument; 
    pdfDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)(PDFURL)); 

    //release the url 
    CFRelease((__bridge CFTypeRef)(PDFURL)); 


    if (pdfDocument) { 

     //get page count 
     int pageCount = CGPDFDocumentGetNumberOfPages (pdfDocument); 

     // 
     if (pageCount > 0) { 

      //set up operator table 
      CGPDFOperatorTableRef pdfOpTable; 
      pdfOpTable = CGPDFOperatorTableCreate(); 

      //call backs for Op Table 
      CGPDFOperatorTableSetCallback (pdfOpTable, "MP", &op_MP); 
      CGPDFOperatorTableSetCallback (pdfOpTable, "DP", &op_DP); 
      CGPDFOperatorTableSetCallback (pdfOpTable, "BMC", &op_BMC); 
      CGPDFOperatorTableSetCallback (pdfOpTable, "BDC", &op_BDC); 
      CGPDFOperatorTableSetCallback (pdfOpTable, "EMC", &op_EMC); 

      for(int i=0; i<pageCount; i++) { 

       //set up 
       CGPDFPageRef thisPage; 
       CGPDFScannerRef pdfScanner; 
       CGPDFContentStreamRef thisContentStream; 

       //get the page 
       thisPage = CGPDFDocumentGetPage (pdfDocument, i + 1); 

       //get the page content stream 
       thisContentStream = CGPDFContentStreamCreateWithPage (thisPage); 

       //create a pdf scanner using our previously created table and callbacks 
       pdfScanner = CGPDFScannerCreate (thisContentStream, pdfOpTable, NULL); 

       //scan the pdf file 
       CGPDFScannerScan (pdfScanner); //-->call backs happen here 

       //release everything 
       CGPDFPageRelease (thisPage); 
       /*CGPDFScannerRelease (pdfScanner); 
       CGPDFContentStreamRelease (thisContentStream);*/ 


      } 
     } 
    } 

    //release the pdf document 
    CGPDFDocumentRelease(pdfDocument); 


} 

static void op_MP (CGPDFScannerRef s, void *info) { 

    const char *name; 

    if (!CGPDFScannerPopName(s, &name)) 
     return; 

    NSLog(@"MP /%s\n", name); 
} 

static void op_DP (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    NSLog(@"DP /%s\n", name); 
} 

static void op_BMC (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    NSLog(@"BMC /%s\n", name); 
} 

static void op_BDC (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    NSLog(@"BDC /%s\n", name); 
} 

static void op_EMC (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    NSLog(@"EMC /%s\n", name); 
} 

EDIT: PDFURL происходит из этого процесса: пользователь выбирает файл PDF, прикрепленный к электронной почте с приложением. В AppDelegate.m:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    /* NSLog(@"Open URL:\t%@\n" 
      "From source:\t%@\n" 
      "With annotation:%@", 
      url, sourceApplication, annotation);*/ 

    NSMutableDictionary* userData = [[NSMutableDictionary alloc] init]; 

    [userData setObject:@"Read PDF" forKey:@"Action"]; 
    [userData setObject:url forKey:@"File Path"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"theMessenger" object:self userInfo: userData]; 

    //NSString *filepath = [url path]; 
    //... 
    return YES; 
} 

в viewcontroller.m

- (void) receiveNotification:(NSNotification*) notification { 
... 
} else if ([strAction isEqualToString:@"Read PDF"]) { 

      NSURL* documentURL = [[notification userInfo] objectForKey:@"File Path"]; 
      [self readPDFFile:documentURL]; 

     } 
... 

EDIT: Если я не отпускайте эту страницу приложение по-прежнему падает:

libobjc.A.dylib`objc_release: 0x3be89f20 : CMP r0, # 0 0x3be89f22: он экв 0x3be89f24: bxeq Lr 0x3be89f26: LDR r1, [г0] 0x3be89f28: MOVs г2, # 2 0x3be89f2a: LDR R1, [r1, , # 16] 0x3be89f2c: BFI r1, r2, # 0, # 2 0x3be89f30: ldrb r1, [r1] 0x3be89f32: tst.w r1, # 2 0x3be89f36: BNE 0x3be89f3e; objc_release + 30 0x3be89f38: movs r1, # 0 0x3be89f3a: b.w 0x3be981c0; - [NSObject релиз] 0x3be89f3e: MOVW r1, # 19326 0x3be89f42: Movt r1, # 507 0x3be89f46: добавить r1, шт 0x3be89f48: LDR R1, [R1] 0x3be89f4a: b.w 0x3be875a0; objc_msgSend 0x3be89f4e: NOP

+0

Где делает 'PDFURL' пришли? Вы уверены, что это должно быть выпущено внутри вашего метода? –

+0

@Martin - см. Правки в нижней части OP – PruitIgoe

+0

Вы не должны выпускать 'PDFURL', потому что вы не являетесь владельцем' documentURL' в вызывающем методе. –

ответ

1

Dont релиз thisPage .. вы получите его через GET вызов не копия или метод создания означает, что вы не владеете его

-

Dont релиз PDURL .. вы получаете его снаружи, но вы не являетесь его владельцем

-

выпустите operatorTable .. вы СОЗДАТЬ его

И

Dont использовать его для нескольких сканеров

+0

Все еще получаю ошибку - см. Править на OP – PruitIgoe

+0

, если я поместил код в состояние i> 0, он не сработает. Но я также не получаю никаких данных. – PruitIgoe

+0

Я отредактировал ответ с 4 очками. –

Смежные вопросы