Вопрос по memory-management, retain, objective-c, nsobject, performselector – executeSelector: withObject: и его поведение при сохранении

9

Это уже вопрос ответа в SO, ноI cannot find it in the Apple documentation anywhere, Не могли бы вы указать мне правильное направление?

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

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

влияние на счетчик выполнения executeSelector: withObject: afterDelay: inModes

Является ли объект, вызывающий executeSelector: withObject: afterDelay, сохраненным с помощью NSRunLoop?

поведение по умолчанию выглядит следующим образом:it retains the receiver and the argument(s).

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

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

гдеuserData это авто-выпущенный объект.

Ведение сохраняемого счета (I know that it could be not valid to do it) данные, передаваемые с приращением, сохраняют количество. Когда метод вызывается для делегата, счет сохранения не равен единице.

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

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

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

Ваш Ответ

2   ответа
11

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

Retain

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

No Retain

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

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

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

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

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

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

This method sets up a timer to perform the aSelector message on the current thread’s run loop.

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

This method sets up a timer to perform the aSelector message on the current thread’s run loop at the start of the next run loop iteration. The timer is configured to run in the modes specified by the modes parameter...The receiver retains the target and anArgument objects until the timer for the selector fires, and then releases them as part of its cleanup.

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

Похожие вопросы