2013-08-05 52 views
2

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

这里是我的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码= 1个错误。看起来应用程序在我改变细节视图时会随机崩溃。我想我会创建一个新的问题。

感谢您的帮助!

+1

顺便说一句,以避免模偏置,而不是'与''%结合运营商arc4random',您可能需要使用['arc4random_uniform'(http://developer.apple。 COM /库/ MAC /文档/达尔文/参考/手册页/ man3/arc4random_uniform.3.html)。但卢卡斯的回答应该解决记忆问题。 – Rob

+0

好的,现在只需要使用imageNamed,你的文件路径没有被正确使用,这是一组完全不同的iOS细节...无论如何,与阵列人的建议一起去吧。我不认为你正在释放该阵列。 –

回答

5

我不知道这是否会导致崩溃(可能性很高),但我真的建议您不要将所有图像存储在阵列中。

更好的方法是存储图像的名称,并分配一个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 
    } 
} 

请给一些反馈它的工作与否。

编辑:

尝试检查随机数得到的是使用它之前,真正有效的索引。

+0

这没有奏效。 – raginggoat

+2

@ user2029585这绝对是正确的做法。您应该只为在任何给定点可见的图像创建'UIImage'对象。当你拥有'UIImage'对象的数组时,你可以很容易地遇到内存问题。 – Rob

+0

再试一次,@ user2029585。如果那仍然不起作用,肯定问题在别的地方。 –

3

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

+0

查看我的问题的更新。 – raginggoat

+1

技术上,是的,但从概念上讲,我不确定是否正确。是的,它不响应内存警告,但它确实响应内存压力。 ('NSCache'表现出类似的行为。) – Rob

+0

我使用来自Web服务的imageData。问题依然存在。 –

1
- (void)didReceiveMemoryWarning { 

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

    [super didReceiveMemoryWarning]; 
} 
+0

谢谢解决了我的问题...... :) :) :) –