9

Это уже ответ на вопрос в SO, но Я не могу найти его в документации Apple где-нибудь. Не могли бы вы указать мне в правильном направлении?performSelector: withObject: и его поведение сохранения

В следующих разделах

Do I have to retain an object before passing it to -performSelector:withObject:afterDelay:?

the effect on retain count of performSelector:withObject:afterDelay:inModes

Is object that calls performSelector:withObject:afterDelay get retained by the NSRunLoop?

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

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

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

где userData является autoreleased роекта.

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

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

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

+0

Я считаю, что значение сохранения больше не является точным при ARC – Dustin

+0

@Cake Я не использую ARC в этом проекте. Благодарю. –

+0

Для проекта с поддержкой ARC вы можете посмотреть - http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown – rishi

ответ

11

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

Сохранил

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

Нет Сохранил

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

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

делает точно такую ​​же вещь, как

[[self delegate] tryToSendStoreData:userData]; 
+0

+1 для вашей поддержки. Но я не могу найти какой-либо документ для этого. Кроме того, почему счетчик удержания увеличивает его значение после выполнения этого вызова? Спасибо. –

+0

@Flex_Addicted: это обычное решение для сохранения функций, а затем автоматическое определение их аргументов для дополнительной безопасности. Вот почему смотреть на счет сохранения бесполезно – newacct

+0

Спасибо. Затем, если у вас есть какой-либо документ, пожалуйста, соедините его. Приветствия. –

10

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

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

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

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

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

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