вызов retain, retainCount с анализом EXC_BAD_ACCESS с выпуском - PullRequest
0 голосов
/ 20 февраля 2012

Я программист Java, плохо знакомый с Objective C, поэтому, пожалуйста, будьте осторожны

Я получаю сообщение об ошибке с сообщением EXC_BAD_ACCESS при вызове release для объекта: Я читаю документацию и темы на этом сайте, но вижу данные, которые меня смущают

- (void) dealloc {
    NSLog(@"dealloc in image Retain count: %i", [image retainCount]);

  [image release];//method throwing EXC_BAD_ACCESS
  ..............
}

количество сохраненных записей: 1

В коде, который вызывает Deloc, у меня есть:

UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage];
NSLog(@"in after instantiation Retain count: %i", [scrn retainCount]);// logs retain count of 1
CGImageRelease(newImage);
Decoder *d = [[Decoder alloc] init];
.....
NSLog(@"in before decoding Retain count: %i", [scrn retainCount]);// logs retain count of 1
decoding = [d decodeImage:scrn cropRect:cropRect] == YES ? NO : YES;
NSLog(@"in after decoding Retain count: %i", [scrn retainCount]); // logs retain count of 2
[d release]; // this line causes invocation of dealloc on the previous code sniplet
[scrn release];

В decodeImage происходит следующее:

- (BOOL) decodeImage:(UIImage *)i cropRect:(CGRect)cr {
NSLog(@"Decoder.mm.decodeImage initial Retain count i : %i retaincount image %i", [i retainCount], [image retainCount]); //logs: Decoder.mm.decodeImage initial Retain count i : 1 retaincount image 0
[self setImage: i];
NSLog(@"Decoder.mm.decodeImage after setting image Retain count i : %i retaincount image %i", [i retainCount], [image retainCount]);//logs: Decoder.mm.decodeImage after setting image Retain count i : 2 retaincount image 2

.......
return [self decode];
}

Есть несколько вещей, которые меня удивляют:

  1. Из того, что понял, retainCount увеличивается путем вызова retain или создания нового объекта, а не путем присваивания одного var другому, как это делается в self setImage: i]; однако я вижу, что счет увеличивается на 1
  2. Перед вызовом [d release] зарегистрированное значение retainCount равно 2, в методе dealloc число равно 1
  3. Если счетчик равен 1, почему я получаю EXC_BAD_ACCESS ???

Редактировать: добавлен дополнительный код по запросу

@implementation Decoder

@synthesize image;

Настройка изображения упоминается в третьем фрагменте кода выше.

1 Ответ

3 голосов
/ 20 февраля 2012

Сохранение счетчика также может увеличиваться системой (для встроенных типов) и свойствами, которые определены с атрибутами retain или copy. Вы несете ответственность только за те причины, которые вы вызвали (не система сохраняет), но не зависите от количества записей при попытке определить, почему вы получаете EXC_BAD_ACCESS. В XCode есть несколько хороших встроенных инструментов анализа, которые лучше подходят для отслеживания ошибок доступа.

Обратите внимание на одну важную вещь: ваш счет никогда не опустится ниже 1, даже если вы отпустите, если счет равен 1.

См. этот вопрос для получения подробной информации о резервном счете.

...