我开始最近使用ARC从那以后,我责备它为每一个存储的问题。 :)也许,你能帮助我更好地理解我在做什么错。
我现在的项目是CoreGraphics在很多 - 图表绘制,景色充满了缩略图等。 我相信,在使用手动内存管理,也许除了几个僵尸就没有问题。但是截至目前,应用程序只需崩溃每次我试图要么创造了很多缩略图或重绘一个比较复杂的图表时。
虽然与仪器剖析我可以看到驻留内存,以及在脏的一个非常高的价值。 堆分析表明相当惊人的不规则成长...
当绘制短短的缩略图,驻留内存增长约200 MB。 当一切都被绘制,记忆力减退回到几乎相同的值绘制前。 然而,有很多缩略图,驻留内存的值高于400 MB和明显崩溃的应用程序。 我试图限制在同一时间(NSOperationQueue及其maxConcurrentOperationCount)绘制的缩略图的数量,但作为释放这么多的内存似乎需要更多的时间,但它并不能真正解决问题。
现在我的应用程序基本上与实际数据有很多复杂的图表=大量的缩略图的有效无效。
(上UIImage的类别):每一个缩略图与此代码从我在这里创建了
+ (void)beginImageContextWithSize:(CGSize)size
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
if ([[UIScreen mainScreen] scale] == 2.0) {
UIGraphicsBeginImageContextWithOptions(size, YES, 2.0);
} else {
UIGraphicsBeginImageContext(size);
}
} else {
UIGraphicsBeginImageContext(size);
}
}
+ (void)endImageContext
{
UIGraphicsEndImageContext();
}
+ (UIImage*)imageFromView:(UIView*)view
{
[self beginImageContextWithSize:[view bounds].size];
BOOL hidden = [view isHidden];
[view setHidden:NO];
[[view layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
[self endImageContext];
[view setHidden:hidden];
return image;
}
+ (UIImage*)imageFromView:(UIView*)view scaledToSize:(CGSize)newSize
{
UIImage *image = [self imageFromView:view];
if ([view bounds].size.width != newSize.width ||
[view bounds].size.height != newSize.height) {
image = [self imageWithImage:image scaledToSize:newSize];
}
return image;
}
+ (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
[self beginImageContextWithSize:newSize];
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
[self endImageContext];
return newImage;
}
有没有使用ARC时就不会吃那么多内存或东西真的错了代码中的一些其他的方式?
其中内存警告+碰撞是发生在其他地方的时候有任何视图的太多重绘。 它并不需要是快速的,只是很多次。 内存堆叠起来,直到它崩溃,我无法找到任何东西它真正负责任。 (I可以看到在VM跟踪越来越驻留/脏存储器和在分配器械堆生长)
我的问题主要是:如何找到为什么它甚至发生? 我的理解是,当不存在给定对象没有所有者,它释放尽快。 我的代码检查表明,大量的对象不释放所有,即使我看不出有任何理由要发生。 我不知道任何保留周期...
我已经通过过渡到ARC发布说明,bbum的大约堆分析和可能其他的十几读条。 不同的使用和不使用ARC莫名其妙地堆分析? 我似乎无法做任何事情与它的有用输出 。
谢谢你的任何想法。
更新:(不强制大家阅读所有的意见,并责成我的诺言)
通过我的代码仔细地获取和增加@autoreleasepool,它有什么意义,内存消耗得到了降低。 最大的问题是调用UIGraphicsBeginImageContext
从后台线程。 固定之后(见@Tammo弗里兹对细节的答案)释放发生足够很快不会崩溃的应用程序。
我的第二碰撞(由同一图的许多重画),完全通过加入解决CGContextFlush(context)
在我的绘制方法的结束。 可耻的是我。
任何人试图做类似的事情一个小警告: 使用OpenGL。 CoreGraphics中不够快的动画大图纸,尤其不能在iPad 3(第一个与视网膜)