Remova com segurança objetos NSMutableDictionary em um loop

Já tentou remover objetos de um NSMutableDictionary em um loop, apenas para obter esta exceção:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFDictionary: 0x7f999b50a3e0> was mutated while being enumerated.'

Aqui está o código que causou essa exceção (dict é um NSMutableDictionary):

for (NSString *key in dict) {
if ([key rangeOfString:@"removeMe"].length > 0) {
[dict removeObjectForKey:key];
}
}

Portanto, quaisquer objetos com uma chave contendo a string “removeMe” são removidos do dicionário. O problema é que você está mudando o dicionário à medida que vai sendo enumerado, o que não é bom. O truque é basear o loop em algo diferente do próprio dicionário. Que tal uma matriz das chaves do dicionário, [dict allKeys]? Vamos ver o mesmo código novamente com esta mudança:

for (NSString *key in [dict allKeys]) {
if ([key rangeOfString:@"removeMe"].length > 0) {
[dict removeObjectForKey:key];
}
}

Agora você não está mais enumerando sobre o dicionário em si, mas sim sobre um novo array que contém as chaves do dicionário. Portanto, você não está alterando o objeto enumerado ao remover coisas do dicionário. Problema resolvido!