[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];
Это копирование блока с последующим автоматическим выпуском оригинала. Смотрите примечание с предыдущим примером.
Тогда ваш ответ таков: ваш код делает что-то не так в другом месте. Исправьте это и вернитесь к первому примеру.