Перейдя к руководству по программированию 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
Где делает 'PDFURL' пришли? Вы уверены, что это должно быть выпущено внутри вашего метода? –
@Martin - см. Правки в нижней части OP – PruitIgoe
Вы не должны выпускать 'PDFURL', потому что вы не являетесь владельцем' documentURL' в вызывающем методе. –