Ваш метод должен возвращать автоматически освобожденный массив, который затем сохраняется методом, который вызывает его, если он хочет / должен его сохранить.
- (NSArray *) setupDetailArray : (NSString *) selectedCategory {
...
// Create the array, but don't own it
NSArray *faceSelection = [[[NSArray alloc] initWithArray:[dict objectForKey:detailTitle]] autorelease];
...
return facesSelected;
}
Теперь код, который вызывает этот метод, должен сохранять объект, если он ему нужен. Итак, по вашему мнению DidLoad
if (faceArray == nil)
faceArray = [[self setupDetailArray:detailTitle] retain];
...
Если faceArray - переменная экземпляра в вашем классе, вы можете просто освободить ее в своем методе dealloc.
У вас также есть утечка памяти здесь
// Set up link to App Delegate
UltimateRageAppDelegate *dataCenter = (UltimateRageAppDelegate *) [[UIApplication sharedApplication] delegate];
dataCenter.faces = [[NSMutableArray alloc] init];
// Set app delegate faces to array
dataCenter.faces = faceSelection;
[dataCenter.faces release];
Это должно быть
// Set up link to App Delegate
UltimateRageAppDelegate *dataCenter = (UltimateRageAppDelegate *) [[UIApplication sharedApplication] delegate];
dataCenter.faces = faceSelection;
Я бы посоветовал вам прочитать (и перечитать и перечитать) документы по управлению памятью и прочитать о свойствах, установщиках и точечной записи.
Управление памятью Apple Objective-C