Проблема Objective-c, суммирующая массив, проходя через него - PullRequest
0 голосов
/ 02 марта 2011

У меня есть этот код, который принимает массив объектов дохода из Core Data.

- (void)totalIncome:(NSMutableArray *)IncomesArray {
    int i;
    int total;
    for (i = 0; i < [IncomesArray count]; ++i)
    {
        Income *income = [IncomesArray objectAtIndex:i];

        total += (int)[income value];
        NSLog(@"%@", total);
    }
    self.totalIncomes = [[NSNumber alloc] initWithInt:(int)total];
    NSLog(@"%.2f", self.totalIncomes);
}

Но строка NSLog (@ "% @", total);вызывает ошибку EXEC BAD ACCESS.Есть ли что-то очевидное, что я сделал неправильно?Также, если я удаляю журнал, ничего не добавляется к totalIncomes, который объявлен в моем заголовочном файле как NSNumber.Благодарю.

Ответы [ 6 ]

7 голосов
/ 03 марта 2011

Как насчет этого:

- (void)totalIncome:(NSMutableArray *)IncomesArray {
    NSNumber *total = [IncomesArray valueForKeyPath:@"@sum.value"];
    NSLog(@"total: %@", total);
}
1 голос
/ 02 марта 2011

Итого - int. используйте NSLog(@"%d", total);

другая вещь, которую вы должны сделать, это инициализировать вашу сумму в 0 с самого начала. В C (и Objective C) внутренние типы не обнуляются для вас. Это, вероятно, влияет на ваш итог.

int total = 0;

Редактировать : в некоторых других ответах предлагается использовать% i. % i и% d эквивалентны для форматирования строки, как и% D. Вот полная таблица спецификаторов формата:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

0 голосов
/ 03 марта 2011

Предлагаемое переписывание:

- (void)totalIncome:(NSMutableArray *)IncomesArray {
    float total = 0; //automatics might not be initialized
    for (Income *income in IncomesArray) //use fast enumeration
    {
        total += [[income value] floatValue];
        NSLog(@"%.2f", [[income value] floatValue]);
    }
    //hand an autoreleased object to your setter:
    self.totalIncomes = [NSNumber numberWithFloat:(float)total]; 
    NSLog(@"%.2f", [self.totalIncomes floatValue]);
}
0 голосов
/ 03 марта 2011
- (void)totalIncome:(NSMutableArray *)IncomesArray {
    int i;
    float total;
    for (i = 0; i < [IncomesArray count]; i++)
    {
        Income *income = [IncomesArray objectAtIndex:i];

        total += [[income value] floatValue];
        NSLog(@"%.2f", [[income value] floatValue]);
    }
    self.totalIncomes = [[NSNumber alloc] initWithFloat:(float)total];
    NSLog(@"%.2f", [self.totalIncomes floatValue]);
}

Еще раз спасибо всем за помощь и быстрые ответы.Все мои ошибки были связаны с тем, что я не всегда понимал важность использования правильных типов данных.

0 голосов
/ 03 марта 2011

Как насчет:

NSEnumerator *enumerator = [IncomesArray objectEnumerator];

int total = 0; 
Income *income;
while (income = [enumerator nextObject]) {
    total += [income intValue];
    NSLog(@"%d", total);    
}

self.totalIncomes = [NSNumber numberWithInt:total];
NSLog(@"%.2f", self.totalIncomes);
0 голосов
/ 02 марта 2011

Вы используете '%@', который используется для строк. Вам нужно использовать '%i' для целых чисел. Пример:

NSLog(@"%i", total);
...