[myArray addObject:[[objcBlock copy] autorelease]] аварийно завершает работу при освобождении массива

Я написал класс для декларативного описания последовательности анимаций UIView. Мой метод берет различные анимационные блоки и помещает их в массив. Итак, в моем цикле я хочу сделать это:

[animations addObject:[[block copy] autorelease]];

я первый copy блок, так что он перемещается в кучу, что позволяет ему быть retain'по массиву. Затем я автоматически освобождаю его, чтобы отказаться от владения (потому что массив сохраняет его).

Однако это происходит сбой, когда массив анимаций освобождается. (Насколько я понимаю, упомянутые блоки уже были освобождены.)

Странная вещь, это работает:

[animations addObject:[block copy]];
[block release];

ОБНОВЛЕНИЕ: -... как это:

[animations addObject:[block copy]];
[block autorelease];

Зачем? Я ожидал бы, что все 3 фрагмента кода будут работать одинаково хорошо. Любое объяснение?

1 ответ

Решение

Пример 1:

[animations addObject:[[block copy] autorelease]];

Это копирование блока и автоматическое освобождение копии.

Пример 2:

[animations addObject:[block copy]];
[block release];

Это копирование блока с последующим выпуском оригинала. Если вы хорошо обращались с памятью, это должно привести к тому, что ваш исходный блок будет перевыпущен (и потерпит крах), а ваша копия будет утечка.

Пример 3:

[animations addObject:[block copy]];
[block autorelease];

Это копирование блока с последующим автоматическим выпуском оригинала. Смотрите примечание с предыдущим примером.

Тогда ваш ответ таков: ваш код делает что-то не так в другом месте. Исправьте это и вернитесь к первому примеру.

Другие вопросы по тегам