Поскольку вы не создаете никаких строк, текущая строка, скорее всего, является одной из строк, которая заканчивается в запросе выборки, и, скорее всего, запрос выборки действительно протекает. (Стек вызовов, показанный в приборах, должен это подтвердить.)
Я не думаю, что у вас есть настоящая утечка, но делая это:
fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
... вы позволяете fetchRequest жить за пределами области, в которой он был определен. Инструменты будут интерпретировать это как утечку.
Авто-релиз фактически заставляет объекты жить дольше, чем прямое освобождение, потому что он заставляет объекты зависать до тех пор, пока не будет истощен внешний пул авто-выпуска. Например, если вы создаете объект-B внутри объекта-A и возвращаете его объекту-C с автоматическим освобождением, объект-B останется живым еще долго после освобождения объекта-A, даже если объект-C никогда не сохранит его. (Хотя в конечном итоге он умрет в непредсказуемый момент.)
Авторелиз не является удобным способом сохранения . У него есть определенная цель сохранения объектов, которые передаются между другими объектами. Если вы этого не делаете, не используйте autorelease.
Если вы сделаете это:
fetchRequest = [[NSFetchRequest alloc] init];
// ...
[fetchRequest release];
... ваша утечка исчезнет.
Возможно, вы захотите сделать это:
return [result autorelease];
... чтобы гарантировать, что результирующий массив живет достаточно долго, чтобы быть сохраненным другим объектом.