Для справки, я уже прочитал:EXC_BAD_ACCESS в iPhone приложение - проблема управления памятью
- memory management question -- releasing an object which has to be returned
- iPhone: Return NSMutableArray in method while still releasing
- Releasing objects returned by method
Что я думал, что помогло бы :).
Это приложение является учебным пособием и призвано помочь людям визуализировать простую генетику. Просто какой-то фон, так что имена переменных и прочее будут иметь смысл. Вот основной код, который выполняется, когда приложение работает:
- (void)viewDidAppear:(BOOL)animated {
ThingzCore *core = [[ThingzCore alloc] init];
ThingzThing *thing1 = [[ThingzThing alloc] init];
thing1.breed = @"AB";
thing1.pattern = @"AC";
thing1.color = @"CA";
thing1.gender = @"XY";
thing1.generation = 1;
thing1.isEgg = NO;
ThingzThing *thing2 = [[ThingzThing alloc] init];
thing2.breed = @"CD";
thing2.pattern = @"BA";
thing2.color = @"CB";
thing2.gender = @"XX";
thing2.generation = 1;
thing2.isEgg = NO;
NSLog(@"Breeding GD BR PT CL G");
ThingzThing *child = [core mateFather:thing1 withMother:thing2];
NSLog(@"Round 1: %@ %@ %@ %@ %d",child.gender,child.breed,child.pattern,child.color,child.generation);
sleep(10);
child = [core mateFather:thing1 withMother:thing2];
NSLog(@"Round 2: %@ %@ %@ %@ %d",child.gender,child.breed,child.pattern,child.color,child.generation);
sleep(10);
child = [core mateFather:thing1 withMother:thing2];
NSLog(@"Round 3: %@ %@ %@ %@ %d",child.gender,child.breed,child.pattern,child.color,child.generation);
sleep(10);
child = [core mateFather:thing1 withMother:thing2];
NSLog(@"Round 4: %@ %@ %@ %@ %d",child.gender,child.breed,child.pattern,child.color,child.generation);
sleep(10);
[thing1 release];
[thing2 release];
[core release];
}
А вот что происходит, когда я запускаю его различными способами:
- Запуск без точек останова, он выходит из строя, без сообщения консоли, после того, как Второй сон(), но до «Round 3» NSLog.
- Запуск с включенными точками останова, но ни один не определен, он проходит через всю последовательность. После четвертого сна() он сбой с EXC_BAD_ACCESS.
- Запуск с включенными точками останова и NSZombiesEnabled, он делает то же самое, что и выше, - никакой дополнительной информации, просто EXC_BAD_ACCESS.
- Работа в приборах не показана.
Это рутина называют четыре раза:
-(ThingzThing *)mateFather:(ThingzThing *)father
withMother:(ThingzThing *)mother {
// will we be doing a mutation?
int mutationPercentage = father.generation + mother.generation;
int mutationNumber = (arc4random() % ((unsigned)100 + 1));
BOOL isMutation = NO;
if (mutationNumber <= mutationPercentage) {
isMutation = YES;
}
// get possibilities
NSArray *possibilities = [self possibilitiesByMatingFather:father
withMother:mother
mutations:isMutation];
// randomly select one of the possibilities
int keeping = (arc4random() % ((unsigned)[possibilities count]));
return [possibilities objectAtIndex:keeping];
}
Без вставки в ВСЮ коде possibilitiesByMatingFather: withMother: функция мутации возвращается в NSMutableArray. Эта процедура объявляет массив с помощью:
NSMutableArray *possibilities = [NSMutableArray array];
Это то:
return possibilities;
Он не посылает релиз или autorelease сообщение для возможностей; я понимаю, что создание массива, как у меня, есть неявное автореле. Я не хотел выделять массив, потому что я возвращаю его, поэтому у меня не было бы возможности явно его освободить.
Объекты, хранящиеся в возможностях NSMutableArray, имеют собственный класс. Они добавляются следующим образом:
Который, кажется, работает большую часть времени. По крайней мере, когда точки останова включены, программа проходит код без жалобы до конца, как указано выше.
Любые предложения о том, что я делаю неправильно, здесь? Это, очевидно, проблемы управления памятью, но я не могу разобраться в этом.
Кстати, в тщетных, метания-вещи-в-стене попытка понять это, я сделал изменить одну строку из основной программы следующим образом:
// get possibilities
NSArray *possibilities = [[self possibilitiesByMatingFather:father
withMother:mother
mutations:isMutation] retain];
безрезультатно. Те же результаты.Таким образом, проблема заключается не в сохранении массива, возвращаемого возможностямиByMatingFather: withMother: mutations. Принуждение к сохранению этого возвращения не помогает.
Я знаю, что это глупый вопрос, но можно вызвать ошибки. Вы можете удалить все строки 'sleep()'; ммм ... просто пытаюсь, потому что я не вижу ничего плохого в вашем коде :) – vodkhang
он ломается после 4-го сна? Возможно ли, что исключение возникает после того, как этот метод остался? Пожалуйста, добавьте NSLog-Foo в последнюю строку этого метода. –
попробуйте заменить [NSMutableArray array] на [[[NSMutableArray alloc] init] autorelease], посмотрим, что произойдет ... также опубликуйте возможностиByMatingFather method – Daniel