daquexian
daquexian

Reputation: 179

Why NSMutableDictionary's setValue:forKey doesn't work

I want to write a timer class that records average elapsed time of a function. So I want to save how many times the function is ran. But the item in dictionary isn't changed.

here is my code:

@implementation Timer {
    NSDate *startTime;
    // NSString *item;
    NSMutableDictionary *itemCounts;
    NSMutableDictionary *itemTimes;

}

- (void)tic {
    startTime = [NSDate date];
}
- (void)tocWithMessage:(NSString*)message {
    if (itemCounts[message] == nil) {
        // itemCounts[message] = @1;
        [itemCounts setValue:@1 forKey:message];
        NSLog(@"%d", [itemCounts[message] integerValue]);
    } else {
        itemCounts[message] = @([itemCounts[message] integerValue] + 1);
    }
    double totalTime = [itemTimes[message] doubleValue];
    double thisTime = -[startTime timeIntervalSinceNow] * 1000;
    totalTime += thisTime;
    itemTimes[message] = @(totalTime);
    int count = [itemCounts[message] integerValue];
    double averageTime = totalTime / count;
    NSLog(@"%@: No.%d, average time: %lfms", message, count, averageTime);
    // std::cout << message << ": " << 1. * (clock() - timerTimestamp) / CLOCKS_PER_SEC * 1000 << "ms" << std::endl;
}

@end

But the itemCounts[message] is always nil. Please help me :)

Thanks in advance!

Upvotes: 0

Views: 61

Answers (2)

Naveen
Naveen

Reputation: 534

You forgot to initialize the dictionaries. In Swift you would have seen a crash if you do like this :)

Upvotes: 1

vadian
vadian

Reputation: 285150

You have only declared the dictionaries.

Before using them you have to initialize them somewhere:

itemCounts = [[NSMutableDictionary alloc] init];
itemTimes = [[NSMutableDictionary alloc] init];

Upvotes: 1

Related Questions