Я не совсем уверен, что вы пытаетесь сделать здесь:
NSMutableArray * profiles = [[NSMutableArray alloc]init ];
profiles = [NSMutableArray arrayWithCapacity:20];
Первая строка создает новый изменяемый массив, называемый профилями. Вторая строка создает автоматически высвобождаемый изменяемый массив с емкостью 20 и назначает его профилям. Таким образом, вы в основном скрываете массив, созданный в первой строке. Вы можете либо сказать
NSMutableArray *profiles = [[NSMutableArray alloc] initWithCapacity:20];
или
NSMutableArray *profiles = [NSMutableArray arrayWithCapacity:20];
Причина, по которой вы рухнули, как упоминалось @ wattson12, заключается в том, что вы удаляете ячейку, которая еще не была создана. Вы всегда хотите попытаться удалить ячейку из очереди, но если она не существует, вам нужно ее создать. Опять же, @ wattson12 предоставил необходимый код для этой задачи.