Objective-C: функционально-подобный макрос против метод - PullRequest
6 голосов
/ 11 апреля 2011

В Objective-C, когда вы рекомендуете использовать функциональные макросы над методами класса или экземпляра?

Ответы [ 4 ]

5 голосов
/ 11 апреля 2011

Это очень разные вещи. Функция или метод существует ровно один раз в вашем коде; макрос вставляет все свое определение в ваш код каждый раз, когда вы его используете.

Некоторые люди пользуются преимуществом того факта, что короткий макрос может расширяться в кусок кода, скорее как дешевая замена шаблонам стиля C ++. Синглтонный макрос Мэтта Галлахера - один из примеров. И, как и шаблоны, чрезмерное использование больших макросов может привести к неожиданно большому коду и большим головным болям отладки.

Помимо констант и крошечных выражений, если вы можете использовать функцию или метод вместо макроса, вам, вероятно, следует это сделать.

3 голосов
/ 11 апреля 2011

На мой взгляд, никогда. Макросы - это эффективные инструменты подстановки текста, которые работают на уровне компилятора, а не во время выполнения вашего кода. Это полезно для определения констант и тому подобного, но не подходит для более сложных вещей.

Функциональные макросы, кажется, используются, когда в коде много повторений, поэтому вам не нужно поддерживать одну и ту же процедуру в тринадцати разных местах. Однако, если вы можете успешно использовать макрос таким образом, ваш код плохо организован - вам, скорее всего, лучше его рефакторинг и создание единственного метода для его реализации.

2 голосов
/ 11 апреля 2011

Трудно понять, что вы на самом деле спрашиваете, но я бы порекомендовал функции над макросами как общее правило, поскольку они выполняют проверку типов, демонстрируют более четкие намерения и облегчат отладку.

0 голосов
/ 04 ноября 2015

Я думаю, Макросы лучше , когда вы выполняете чувствительные операции, поскольку это затрудняет отладку.

Например, вместо использования метода, подобного isJailBroken () , который возвращает логическое значение, можно использовать макрос, чтобы определить, является ли устройство джейлбрейкнутым.

Это затрудняет работу злоумышленника во время выполнения манипуляций!

...