[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 фрагмента кода будут работать одинаково хорошо. Любое объяснение?


person Yang Meyer    schedule 02.05.2011    source источник
comment
Я считаю, что в вашем коде есть что-то еще, что вызывает сбой. То, что вы опубликовали, правильно и должно работать. Сможете ли вы создать минимальный тестовый пример, воспроизводящий эту проблему?   -  person    schedule 02.05.2011
comment
Спасибо за подсказку. Я все еще занимаюсь исследованием, в настоящее время пытаюсь создать минимальный тестовый пример.   -  person Yang Meyer    schedule 02.05.2011
comment
Бавариус был прав. Проблема заключалась в том, что в предыдущей попытке исправить утечку памяти я вручную освободил блоки перед освобождением содержащего их массива. Странно, однако, что чрезмерное освобождение блоков не привело к сбою в двух нижних фрагментах кода!   -  person Yang Meyer    schedule 02.05.2011


Ответы (1)


Пример 1:

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

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

Пример 2:

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

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

Пример 3:

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

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

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

person Steven Fisher    schedule 18.05.2011
comment
Красиво замеченный @ steven-fisher - person jjwchoy; 18.05.2011