Вместо инициализации с помощью initWithObjectAndKeys. Почему бы не создать экземпляр NSMutableDictionary, а затем добавить пары ключ-значение (или нет, если ключ имеет значение null)?
NSMutableDictionary * params = [[NSMutableDictionary alloc] init];
if (fbAccessTokenKey)
[params setObject:fbAccessTokenKey forKey:@"fb_access_token];
// ... etc
Вы можете привести его обратно к NSDictionary позже, если вы хотите сохранить его неизменным с этого момента.
Обновление
Просто примечание в ответ на комментарий Джоша , я должен уточнить, что, конечно, приведение не будет магически преобразовывать параметры NSMutableDictionary в NSDictionary. Но если вы передаете его в код, который требует NSDictionary, приведение позволит вам обращаться с ним как таковым.
Комментарий Джоша включает в себя этот код:
NSMutableDictionary * md = [[NSMutableDictionary alloc] init];
NSDictionary * d = (NSDictionary *)md;
[d setObject:@"Yes I am" forKey:@"Still mutable?"];
NSLog(@"%@", d); // Prints { "Still mutable?" = Yes I am; }
Это сгенерирует следующее предупреждение компилятора (и для меня, с предупреждениями, генерирующими ошибки, ошибку компиляции):
файл: blah.m: ошибка: семантическая проблема: «NSDictionary» может не отвечать на «setObject: forKey:»