Оставляя в стороне вопросы, ответы на которые были даны в другом месте, - что вы постоянно создаете новую строку, которая включает в себя старую плюс некоторую дополнительную, оставляя старую в пуле автоматического выпуска, которая не будет стерта по крайней мере, пока вы не выйдете из метода - следующее:
NSArray *values = [aDict objectsForKeys:itemKeys notFoundMarker:@""];
theString = [values componentsJoinedByString:@","];
Казалось бы, делать то, что вы хотите (ну, если вы добавите дополнительную запятую в конце) без какого-либо явного вида внутреннего цикла.