Здесь две ошибки -
1) unsigned long не объект, а примитив. Вам просто нужно удалить «*» перед num следующим образом -
unsigned long num = [[dict objectForKey:@"foo"] unsignedLongValue];
2) Формат неподписанного long -% lu, а не% o, как вы упомянули.
NSString *oct = [NSString stringWithFormat:@"%lu", num];
Итак, правильный код должен быть -
NSDictionary *dict = @{@"foo": @420};
unsigned long num = [[dict objectForKey:@"foo"] unsignedLongValue];
NSString *oct = [NSString stringWithFormat:@"%lu", num];
NSLog(@"%04u", [oct intValue]); // 0644