我的问题是关于核心数据和内存使用情况。我之前使用过核心数据,但这次数据量更高,这让我意识到还有更多要知道的东西。我已经看到有其他几个类似的帖子,我从他们那里得到了有趣的信息,但在应用它后我的应用程序仍然崩溃。我一直在处理这个问题一个星期了。有人请帮忙。
基本上我分别有三个64,15和17次迭代的类似循环。它们在模拟器上工作正常。在几台iPad上测试后,它们会收到内存警告,并且在同一次迭代中崩溃(第一个循环的第34个)。在iPad 2上测试它将在第二个循环的第14位崩溃。仪器显示实时和整体的内存使用量约为1.5 MB。泄漏几KB。
循环执行以下(代码如下)
非常常见的任务不是吗?
现在,由于我遇到了内存问题,我尝试使用我所知道的所有已知(我)工具,它们是:
应用所有这些技术后,我得到了一个令人兴奋的结果:应用程序在与之前完全相同的位置崩溃。
这是代码。
- (void) myMainProcedure {
[self performLoop1];
[self performLoop2]; // Similar to loop1
[self performLoop3]; // Similar to loop1
}
- (void) performLoop1 {
NSError * error = nil;
NSAutoreleasePool * myOuterPool;
NSAutoreleasePool * myInnerPool;
NSManagedObjectContext * applicationContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
[applicationContext setUndoManager:nil];
NSEntityDescription * myEntityDescription = [NSEntityDescription entityForName:@"EntityName"
inManagedObjectContext:applicationContext];
NSFetchRequest * myFetchRequest = [[NSFetchRequest alloc] init];
[myFetchRequest setEntity:myEntityDescription];
NSString * column = @"columnName";
NSPredicate * aWhereClause = [NSPredicate predicateWithFormat:
@"(%K = %@)", column, [NSNumber numberWithInt:0]];
[myFetchRequest setPredicate: aWhereClause];
myOuterPool = [[NSAutoreleasePool alloc] init];
NSArray * myRowsArray = [applicationContext executeFetchRequest:myFetchRequest
error:&error];
NSMutableArray * myRowsMutableArray = [[NSMutableArray alloc] initWithCapacity:0];
[myRowsMutableArray addObjectsFromArray: myRowsArray];
[myOuterPool drain];
[myFetchRequest release];
EntityName * myEntityRow;
int totalNumberOfRows = [myRowsMutableArray count];
myOuterPool = [[NSAutoreleasePool alloc] init];
for (int i = 0; i < totalNumberOfRows; i++) {
myInnerPool = [[NSAutoreleasePool alloc] init];
myEntityRow = [myRowsMutableArray objectAtIndex:0];
NSString * storedSmallAttribute = myEntityRow.smallAttribute;
UIImageView * largeData = [self myMethodUsingParameter: smallAttribute];
myEntityRow.largeAttribute = largeData;
[myRowsMutableArray removeObjectAtIndex:0];
[applicationContext save:&error];
[applicationContext refreshObject:myEntityRow mergeChanges:NO];
[myInnerPool drain];
[largeData release];
}
[myOuterPool drain];
[myRowsMutableArray release];
}
- (UIImageView *) myMethodUsingParameter : (NSString *) link {
UIImageView * toBeReturned = nil;
NSURL *pdfURL = [NSURL fileURLWithPath:link];
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
UIGraphicsBeginImageContext(pageRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context,pageRect);
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, pageRect.size.height);
CGContextScaleCTM(context, 1, - 1);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);
UIImage *imageToBeReturned = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CFRelease(pdf);
toBeReturned = [[UIImageView alloc] initWithImage:imageToBeReturned];
UIGraphicsEndImageContext();
return toBeReturned;
}
请注意
谢谢。
答案 0 :(得分:0)
我认为你应该重新审视一下你的问题。 处理核心数据的方法有很多,比您的方法简单得多。 为您的Core Data实体创建类文件可能对您有所帮助。 此外,在保存文件时,应认真评估每个对象的必要性以及是否可以采用更好的方式。 在你的情况下,我会提出两个建议:
对于每个PDF网址,
对于每个PDF网址,