Ваша линия:
keysArray[row][col] = [[[keys objectAtIndex:0] retain] autorelease];
Я не эксперт Objective-C или что-то в этом роде, но я не уверен, что вам нужно автоматически высвобождать этот объект, потому что вы не выделили ему память. Что происходит, когда вы пытаетесь удалить этот авто-релиз?
Я подозреваю, что после того, как вы автоматически освободите объект, а затем попытаетесь присвоить значение массива здесь:
[b setImage: [UIImage imageNamed:keysArray[j][i]]
forState:UIControlStateNormal];
вы получаете EXC_BAD_ACCESS.
Я могу ошибаться, и в этом случае я надеюсь, что кто-то умнее меня сможет это прояснить. :)