[myArray addObject: [[objcBlock copy] autorelease]] вылетает при освобождении массива - PullRequest
4 голосов
/ 02 мая 2011

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

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

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

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

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

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

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

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

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

1 Ответ

6 голосов
/ 18 мая 2011

Пример 1:

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

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

Пример 2:

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

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

Пример 3:

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

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

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

...