2

私の分割ビュー iPad アプリでは、デフォルトの詳細ビューが配列からランダムな画像を読み込み、ユーザーがそのビューに戻るたびにこれを行います。アプリはそのビューで正常に読み込まれ、別のビューに正常に移動できます。問題は、そのビューに戻るとクラッシュする場合があり、デフォルト ビューに戻った後に別のビューを選択するとクラッシュする場合があることです。リーク ツールを実行してもリークは表示されず、クラッシュが発生するたびにログに何も表示されません。「Received Memory Warning」ログを一度受け取ったので、クラッシュがどこかでリークに関係しているに違いありません。どこにあるのかわかりません。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];
}

編集: imageNamed の代わりに imageWithData を使用するという提案を使用しようとしているので、これを行っています:

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 エラーが発生するため、例外ブレークポイントを設定しました。詳細ビューを変更しているときに、アプリがランダムにクラッシュするようです。新しい質問を作成すると思います。

助けてくれてありがとう!

4

3 に答える 3

5

これがクラッシュの原因であるかどうかはわかりませんが (その可能性が高い)、配列内にすべての画像を保存しないことを強くお勧めします。

より良いアプローチは、画像の名前を保存し、その名前を選択して UIImage を 1 つだけ割り当てることです。

これを参照してください:

- (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 が本当に有効なインデックスかどうかを確認してください。

于 2013-08-05T17:41:14.300 に答える
1
- (void)didReceiveMemoryWarning {

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

    [super didReceiveMemoryWarning];
}
于 2015-04-08T11:43:52.200 に答える