Я подозреваю, что проблема в конечном счете связана с запутанным управлением памятью члена colourPalettesContainer
. Вы освобождаете его в методе dealloc
делегата приложения, но этот класс никогда не сохраняет его! Было бы намного чище, если бы вы следовали рекомендациям Apple по управлению памятью : ваши классы должны выпускать только те объекты, которыми они владеют (то есть, которые они сами сохранили ранее). Например, вы можете сделать это, объявив свойство массива retain
:
@property (retain) NSMutableArray *colourPalettesContainer;
(Чтобы предотвратить утечку массива, вам также необходимо освободить или автоматически выпустить его в методе newPalette
. Сохранение и освобождение всегда должны происходить в тесных парах.)
Но еще лучше, почему бы просто не создать массив в методе init делегата приложения или в его методе доступа (если по какой-то причине вы хотите продолжить создавать его только при первом его использовании)? Если вы не хотите заменить все палитры одновременно, нет никаких оснований позволять назначать массив извне делегата приложения.
@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> {
@private
NSMutableArray *colourPalettesContainer;
}
@property (readonly) NSMutableArray *colourPalettesContainer;
@end
@implementation PalettesAppDelegate
- (NSMutableArray *)colourPalettesContainer {
if (colourPalettesContainer == nil) {
colourPalettesContainer = [[NSMutableArray alloc] init];
return colourPalettesContainer;
}
- (void)dealloc {
[colourPalettesContainer release];
[super dealloc];
}
@end
Чтобы сделать дизайн еще чище, измените тип свойства colourPalettesContainer
на NSArray *
и добавьте метод -addPalette:
к делегату приложения. (Редко хорошей идеей является публичное представление изменяемого массива внутри класса.) Затем вы можете просто избавиться от -newPalette
в HandlingPalettes
. (Если вы хотите, чтобы все ваши методы обработки палитр были в HandlingPalettes
, просто переместите массив туда. Если вам нужен доступ к палитрам из случайных мест в вашем приложении, тогда вы можете просто поместить сохраненную ссылку на ваш HandlingPalettes
объект в приложении делегат.)
Как только вы уберете беспорядок владения объектами, несоответствие счетчиков будет устранено "по волшебству", или причина, вероятно, станет намного более очевидной. В последнем случае убедитесь, что HomeView
dataCenter
на самом деле является тем же объектом, что и HandlingPalettes
. (Вы не указали, как HomeView
получает его ссылку - вы уверены, что случайно не создаете другой экземпляр делегата приложения?)
(Кстати, вы, вероятно, хотели использовать -addObjects:
, а не -addObject:
в newPalette
. Обратите внимание также, что все имена классов должны быть написаны заглавными буквами, без исключений: т. Е. Всегда используйте PalettesAppDelegate
, никогда palettesAppDelegate
. Если по какой-то причине шаблон проекта Xcode создал его таким образом, просто переименуйте класс. Имена классов в нижнем регистре слишком легко спутать с именами переменных. Также попробуйте найти более подходящие имена в целом: например, вместо HandlingPalettes
Я бы использовал PalettesViewController
(чтобы отразить тот факт, что это подкласс UIViewController), а вместо dataCenter
я бы просто выбрал appDelegate
.)