Это не сбой, вызванный утечкой памяти, а чрезмерным выпуском памяти. Ваш сбой вызван этой строкой:
[path release];
Удалите эту строку, и все будет в порядке. Во всяком случае, для некоторых значений штрафа; большинство из того, что говорит Джордж, также применимо.
Причина в том, что освобождаемый путь будет таким:
path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"nativity_test_%i", i] ofType:@"jpg"];
Это объект с эффективным счетом удержания, равным нулю. Несмотря на то, что он имеет положительный счет сохранения, он уже был автоматически выпущен и будет освобожден, когда вы вернетесь в основной цикл событий.
Вы также должны удалить эту строку:
NSString *path = [[NSString alloc] init]; //dynamic path of images to save to array
Причина в том, что вы присваиваете pathForResource результат, а не используете его на самом деле. Конечно, вам нужно будет объявить path как переменную. Я предлагаю изменить строку pathForResource следующим образом:
NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"nativity_test_%i", i] ofType:@"jpg"];
Это разумное изменение, поскольку нет причин, по которым вам это нужно вне цикла.
Вы также должны исправить эту строку:
[picArr addObject:[[UIImage alloc] initWithContentsOfFile:path]];
[UIImage alloc] возвращает UIImage с эффективным счетом сохранения 1. Добавление его в массив увеличит его до двух. Если вы просто освободите массив позже, это приведет к утечке памяти. Вместо этого:
[picArr addObject:[[[UIImage alloc] initWithContentsOfFile:path]] autorelease];
Это будет означать, что вы добавляете в массив UIImage с эффективным счетом сохранения 0, что увеличивает его до 1, делая массив единственным владельцем объекта. Позже, когда массив исчезнет, то же самое произойдет с большинством изображений. (ImageView также будет принадлежать тому, что ему назначено.)
Не расстраивайтесь из-за этого: однажды скоро вы просто внезапно получите его и удивитесь, почему это когда-либо вызывало у вас головную боль. :)