【问题标题】:Received Memory Warning iOS收到内存警告 iOS
【发布时间】:2013-08-05 17:32:49
【问题描述】:

在我的拆分视图 iPad 应用程序中,默认详细视图从数组中加载随机图像,并在用户返回该视图时执行此操作。该应用程序可以很好地加载该视图,我可以很好地转到另一个视图。问题是,如果我返回该视图,有时它会崩溃,如果我在返回默认视图后选择另一个视图,有时它会崩溃。当我运行泄漏工具时,我没有显示任何泄漏,并且每次发生崩溃时我都没有在日志中显示任何内容。我确实收到过一次“收到的内存警告”日志,所以崩溃一定与某处的泄漏有关,我只是不确定在哪里。我正在使用 ARC。有什么想法吗?

这是我的 viewDidLoad 方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImage *agelity = [UIImage imageNamed:@"Agelity"];
    UIImage *agelity2 = [UIImage imageNamed:@"Agelity2"];
    UIImage *biltmore = [UIImage imageNamed:@"Biltmore"];
    UIImage *biltmore2 = [UIImage imageNamed:@"Biltmore2"];
    UIImage *biltmore3 = [UIImage imageNamed:@"Biltmore3"];
    UIImage *choice = [UIImage imageNamed:@"Choice"];
    UIImage *enterprise = [UIImage imageNamed:@"Enterprise"];
    UIImage *enterprise2 = [UIImage imageNamed:@"Enterprise2"];
    UIImage *grainger = [UIImage imageNamed:@"Grainger"];
    UIImage *grainger2 = [UIImage imageNamed:@"Grainger2"];
    UIImage *greatWolf = [UIImage imageNamed:@"Great_Wolf"];
    UIImage *greatWolf2 = [UIImage imageNamed:@"Great_Wolf2"];
    UIImage *officeDepot = [UIImage imageNamed:@"Office_Depot1"];
    UIImage *officeDepot2 = [UIImage imageNamed:@"Office_Depot2"];
    UIImage *officeDepot3 = [UIImage imageNamed:@"Office_Depot3"];
    UIImage *sams = [UIImage imageNamed:@"Sams"];
    UIImage *sams2 = [UIImage imageNamed:@"Sams2"];

    NSMutableArray *benefitAds = [[NSMutableArray alloc]initWithObjects:agelity, agelity2, biltmore, biltmore2, biltmore3, choice, enterprise, enterprise2, grainger, grainger2, greatWolf, greatWolf2, officeDepot, officeDepot2, officeDepot3, sams, sams2, nil];

    int randomIndex = arc4random() % [benefitAds count];

    adImage.image = [benefitAds objectAtIndex:randomIndex];

    [self configureView];
}

编辑:我正在尝试使用使用 imageWithData 而不是 imageNamed 的建议,所以我这样做:

NSData *agelityData = [NSData dataWithContentsOfFile:@"Agelity"];
    UIImage *agelity = [UIImage imageWithData:agelityData];

但现在应用程序在启动时崩溃了:

int randomIndex = arc4random() % [benefitAds count];

与:

Thread 1: EXC_ARITHMETIC(code=EXC_I386_DIV, subcode=0x0)

当我在我的设备而不是模拟器上运行它时,我得到了这个:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3051310543 beyond bounds for empty array'

编辑:我设置了一个异常断点,因为我收到了 exc_bad_access code=1 错误。当我更改详细信息视图时,看起来应用程序有时会随机崩溃。我想我会创建一个新问题。

感谢大家的帮助!

【问题讨论】:

  • 顺便说一句,为了避免模数偏差,而不是将arc4random% 运算符结合使用,您可能希望使用arc4random_uniform。但卢卡斯的回答应该解决内存问题。
  • 好的,现在只使用 imageNamed,你的文件路径没有被正确使用,这是一组完全不同的 iOS 细节......无论如何,请按照数组人的建议。我认为您不会释放该数组。

标签: ios didreceivememorywarning


【解决方案1】:

我不知道这是否正是导致崩溃的原因(很有可能),但我真的建议您不要将所有图像都存储在数组中。

更好的方法是存储图像的名称,并仅分配一个 UIImage,并选择名称。

看这个:

- (void)viewDidLoad
{ 
    NSMutableArray *benefitAds = [[NSMutableArray alloc]initWithObjects:@"Agelity", @"Agelity2", @"Biltmore", @"Biltmore2", @"Biltmore3", @"Choice", @"Enterprise", @"Enterprise2", @"Grainger", @"Grainger2", @"Great_Wolf", @"Great_Wolf2", @"Office_Depot1", @"Office_Depot2", @"Office_Depot3", @"Sams", @"Sams2", nil];

   int randomIndex = arc4random() % [benefitAds count];

   if(randomIndex < [benefitAds count]) {
       adImage.image = [UIImage imageNamed:[benefitAds objectAtIndex:randomIndex]];
       [self configureView];
   }
   else
   {
     //error message
   }   
}

请提供一些反馈它是否有效。

编辑:

在使用之前尝试检查随机数get是否真的是一个有效的索引。

【讨论】:

  • @user2029585 这绝对是正确的方法。您应该只为在任何给定点可见的图像创建UIImage 对象。当您有 UIImage 对象的数组时,您很容易遇到内存问题。
  • 再试一次,@user2029585。如果那仍然不起作用,那么肯定问题出在其他地方。
【解决方案2】:

imageNamed:使用不会在内存警告时清空自身的内部缓存。试试 imageWithData

【讨论】:

  • 从技术上讲,是的,但从概念上讲,我不确定这是否正确。是的,它不响应内存警告,但它确实响应内存压力。 (NSCache 表现出类似的行为。)
  • 我正在使用来自 Web 服务的 imageData。问题依然存在。
【解决方案3】:
- (void)didReceiveMemoryWarning {

    if([self isViewLoaded] && self.view.window == nil) {
       self.view = nil;
    }

    [super didReceiveMemoryWarning];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多