iOS应用程序崩溃:内存不足
我有三个实体User、LiveCard和LivePromos,我使用核心数据存储它们。 当我将这些数据读入内存并将其聚合到单个对象中时,我的应用程序崩溃并给出如下所示的错误iOS应用程序崩溃:内存不足,ios,objective-c,memory-leaks,automatic-ref-counting,Ios,Objective C,Memory Leaks,Automatic Ref Counting,我有三个实体User、LiveCard和LivePromos,我使用核心数据存储它们。 当我将这些数据读入内存并将其聚合到单个对象中时,我的应用程序崩溃并给出如下所示的错误 User *user = (User *)[self getEntityWithName:@"User" andPopulator:@selector(populateUser:)]; if(user != nil) { NSMutableArray *liveCards = [self getEntityWithN
User *user = (User *)[self getEntityWithName:@"User" andPopulator:@selector(populateUser:)];
if(user != nil)
{
NSMutableArray *liveCards = [self getEntityWithName:@"LiveCard" andPopulator:@selector(populateLiveCard:)];
[user setCards:liveCards];
NSArray *livePromos = [self getEntityWithName:@"LivePromo" andPopulator:@selector(populatePromos:)];
for(LiveCard *card in user.cards) {
NSMutableArray *cardsPromo = [NSMutableArray array];
for(LivePromo *promo in livePromos) {
if([card.cardId isEqualToString:promo.cardId]) {
[cardsPromo addObject:promo];
}
}
card.promos = cardsPromo;
}
}
return user;
这就是我得到的错误
MyApp(39516,0x3d38bb78)malloc:**mmap(大小=1935958016)失败(错误代码=12)
***错误:无法分配区域
***在malloc\u error\u break中设置断点以进行调试
注意:我在应用程序中使用ARC
更新
我已经尝试设置malloc\u error\u break
符号断点,这是我得到的踏板导航器的屏幕截图
我还在iPhone模拟器中的应用程序上运行了Instrument.Allocations实用程序,下面是一个屏幕截图,显示了malloc
中的大内存分配。我无法理解的是,这种分配是在哪里进行的
很抱歉,我无法直接在上上载图像,所以
更新感谢大家的投入,问题是UICollectionView已损坏,物品数量以百万计。问题现在已解决,不再“明显”,但您是否已尝试在
malloc\u error\u break
上设置断点?当它点击该函数时,它将停止,查看回溯的其余部分将向您显示代码中的哪些内容负责进行这一巨大的分配。1。“尽管有ARC”-不,ARC不是一个神奇的“让我的应用程序使用更少的内存”功能。2.你看到错误信息了吗?您正试图分配1935958016字节。@H2CO3据我所知,ARC负责取消分配创建的对象。MyApp只读取一些文本数据,在任何一个实例中都不应达到1935958016字节,除非它们随时间累积。ARC只负责插入保留/释放消息,而不是您编写它们。ARC!=垃圾收集。启用ARC并不能免除您了解引用计数的需要。也就是说,这可能不是由于过度保留对象而导致的堆增长。错误表明这是一个很大的分配。您可能正在破坏堆,尽管可能还有其他问题。无论如何,当应用程序在malloc\u error\u break
中遇到断点时,请在线程导航器中复制堆栈跟踪。然后回到这里,编辑您的问题,并粘贴到堆栈跟踪中。您所谓的“stacktrace”只是对malloc\u error\u break
函数的反汇编,这是无用的。我已经尝试设置断点,我已经更新了我的问题以反映同样的情况。请发表评论。您必须向上拖动线程导航器上的详细信息滑块。(底部)完成,更新图像以包含所有详细信息。您配置UICollectionView的方式中的某些内容导致它尝试进行此巨大的分配。考虑到这种情况发生在一个名为\u updateItemCount
的方法中,我猜可能是项目太多了?或者某些哨兵价值,比如NSNotFound,在某处被视为“真实”价值。这里没有足够的信息可以说明,但是分配发生在-[UICollectionView layoutSubviews]
中,因此这是关于如何在应用程序中配置UICollectionView的问题。