0

私はexcの悪いアクセスに問題があります。すでに NSZombieEnabled を有効にしましたが、この問題が発生する理由がわかりません。cartInstance 配列がどのように定義されているかは、次の関数で確認できます。これは、複数の NSMutableDictionaries を持つ NSMutableArray です。カウンター i が 13 に達するたびにエラーが発生します。その後、exc bad access と、タイトルに示されているメッセージが表示されます。ここにいくつかのコードがあります:

-(void)addToCart:(NSDictionary *) article{
if(article!=nil){

    NSString * amount    = @"amount";
    NSString * articleId = @"articleId";
    NSString * detailKey = @"detailKey";



    NSString *curId = [article objectForKey:@"articleId"];

    //check if article already in shopping cart
    if([cartInstance count]>0)
    {
        for(int i=0;i<[cartInstance count];i++) {
            NSString *tempStr = [[cartInstance objectAtIndex:i] objectForKey:articleId];
            if([tempStr isEqual:curId]) {

                NSNumber *newAmount = [[cartInstance objectAtIndex:i] objectForKey:amount];
                NSLog(@"AddtoCart");
                int tempInt = [newAmount intValue]+1;//Here is where the magic happens
                newAmount = [NSNumber numberWithInt:tempInt];
                [[cartInstance objectAtIndex:i] setObject:newAmount forKey:amount];
                [newAmount release];
                return;
            }
        }
    }


    NSDictionary *details = article;
    NSDictionary *shoppingItem = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:1],amount,
                                  curId,articleId,
                                  details,detailKey,
                                  nil];
    [shoppingItem retain];

    [cartInstance addObject:shoppingItem];
    id obj;
    NSEnumerator * enumerator = [cartInstance objectEnumerator];
    while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

}
else{
    NSLog(@"Error: Could not add article to shoppingcart.");
}

}

誰でも私を助けることができますか?前もって感謝します。

4

2 に答える 2

3

あなたが持っている1つの問題はここにあります:

            newAmount = [NSNumber numberWithInt:tempInt];
            [[cartInstance objectAtIndex:i] setObject:newAmount forKey:amount];
            [newAmount release];

これにより、自動解放された NSNumber が割り当てられますが、後で手動で解放します。これをしないでください。

アプリで「ビルドと分析」を使用してみてください。このようなメモリ管理の問題を指摘します。

于 2010-03-08T03:19:53.277 に答える