PerformSelector:withObject: и его поведение сохранения

На этот вопрос уже есть ответ в SO, но я нигде не могу найти его в документации Apple. Не могли бы вы указать мне правильное направление?

В следующих темах

Должен ли я сохранять объект перед передавая его в -performSelector:withObject:afterDelay:?

влияние на сохранение счетчика PerformSelector:withObject:afterDelay:inModes

Является ли объект, который вызывает PerformSelector:withObject:afterDelay, сохраняется NSRunLoop?

поведение по умолчанию выглядит следующим образом: сохраняется получатель и аргумент(ы).

Я использую следующий код

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];

где userData — это автоматически выпущенный объект.

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

Итак, мой вопрос: нужно ли мне выполнять какое-то управление памятью, чтобы избежать утечек, или я должен доверять материалам Apple? Здесь я говорю как агностик, так как я не могу найти нужные документы.

Заранее спасибо.


person Lorenzo B    schedule 27.06.2012    source источник
comment
Я считаю, что подсчет удержания больше не является точным в соответствии с ARC   -  person Dustin    schedule 27.06.2012
comment
@Cake Я не использую ARC в этом проекте. Спасибо.   -  person Lorenzo B    schedule 27.06.2012
comment
Для проекта с поддержкой ARC вы можете изучить - stackoverflow.com/questions/7017281/   -  person rishi    schedule 27.06.2012
comment
И поскольку вы не используете ARC, поэтому простой ответ на это - НЕТ, вам не нужно обрабатывать память с помощью селектора выполнения, как обсуждалось в упомянутой выше ветке.   -  person rishi    schedule 27.06.2012
comment
@rishi Спасибо. Вы знаете, где я могу найти нужные документы? Не могу найти на него документацию. Спасибо.   -  person Lorenzo B    schedule 27.06.2012
comment
@Flex_Addicted - Документы обновлены, так как теперь используется ARC. Таким образом, вы не сможете найти то, что было там раньше. Но вы можете быть уверены в том, что упоминается в приведенных выше темах.   -  person rishi    schedule 27.06.2012


Ответы (2)


Вы смотрите не на ту функцию в документации.

Сохранить

performSelector:withObject:afterDelay: и подобные функции (с afterDelay) сохраняют получателя и аргументы, потому что они выполняются позже

Без сохранения

performSelector:withObject: и подобные функции (без afterDelay) ничего не сохраняют, так как они просто вызывают функцию напрямую.

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];

делает то же самое, что и

[[self delegate] tryToSendStoreData:userData];
person newacct    schedule 27.06.2012
comment
+1 за вашу поддержку. Но я не могу найти никакого документа для этого. Кроме того, почему счетчик удержания увеличивает свое значение после выполнения этого вызова? Спасибо. - person Lorenzo B; 28.06.2012
comment
@Flex_Addicted: функции обычно сохраняют, а затем автоматически освобождают свои аргументы для дополнительной безопасности. Поэтому смотреть на количество удержаний бесполезно. - person newacct; 28.06.2012
comment
Спасибо. Затем, если у вас есть какой-либо документ по нему, пожалуйста, дайте ссылку на него. Ваше здоровье. - person Lorenzo B; 28.06.2012
comment
@Flex_Addicted: stackoverflow.com/questions/4636146/when-to-use -retaincount Никогда не используйте continueCount. это бесполезно - person newacct; 28.06.2012

Хотя @newacct дал правильный ответ, но это был не вопрос, который задал @Flex_Addicted, то есть цитаты из документации Apple, что наблюдаемое поведение действительно гарантировано. Ниже приведена (частичная) цитата, но нам придется пройти через пару обручей, чтобы добраться туда -

Документация для performSelector:withObject :afterDelay: утверждает, что

Этот метод устанавливает таймер для выполнения сообщения aSelector в цикле выполнения текущего потока.

Итак, теперь мы переходим к документации для NSRunLoop и обнаруживаем, что существует только один метод, который позволяет ставить объекты в очередь в цикле выполнения —
performSelector:target:argument:order :modes:, в документации которого указано, что

Этот метод устанавливает таймер для выполнения сообщения aSelector в цикле выполнения текущего потока в начале следующей итерации цикла выполнения. Таймер настроен на работу в режимах, заданных параметром Modes...Приемник сохраняет объекты target и anArgument до тех пор, пока не сработает таймер для селектора, а затем освобождает их в ходе очистки.

Конечно, ничто не гарантирует, что [NSObject performSelector:withObject:afterDelay:] всегда использует [NSRunLoop performSelector:target:argument:order:modes:] (хотя этот ответ был бы полным, если бы кто-то мог придумать для этого документацию), но, по крайней мере, это шаг к тайне ответа на загадки, которыми загадывают нас священные писания.

person Manav    schedule 19.10.2012