В вашей init
функции:
StateStack* s = [[StateStack alloc] init];
state = s;
[s push:NONE]; //<--EXC_BAD_ACCESS on load here
[s release];
вы выделяете экземпляр StateStack
; это получает счет сохранения 1. Затем, в конце функции, которую вы вызываете release
, счет сохранения возвращается к 0, и объект готов к освобождению. Таким образом, когда позже выполняется dealloc
, state
ivar отправляется еще один release
, и это вызывает плохой доступ. Вам не нужно освобождать s, так как вы хотите сохранить это состояние. Та же самая ошибка встречается в другом методе init.
Это было бы правильно:
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
StateStack* s = [[StateStack alloc] init];
state = s;
[s push:NONE]; //<--EXC_BAD_ACCESS on load here
}
return self;
}
- (id)init {
self = [super init];
if (self) {
NSMutableArray* s = [[NSMutableArray alloc] init];
stack = s;
}
return self;
}
NB. Я не хочу создавать недоразумений. Использование retain count для проверки правильного распределения памяти бесполезно. Это правда. В любом случае, рассуждения с точки зрения количества записей помогают понять, что происходит, когда вы выделяете / отпускаете / автоматически выпускаете объект. Это основной механизм, но слишком сложно отследить его использование, чтобы проверить правильность управления памятью.