Почему макросы в Objective-C / Какао? - PullRequest
4 голосов
/ 19 мая 2010

Я приехал из места без макросов (Java / Python / C # / Scala), поэтому, возможно, моя точка зрения искажена, но ...

Почему макросы используются в какао? Два, которые приходят на ум, это NSLocalizedString и NSAssertSTAssert). Было бы так сложно / непригодно заставить их функционировать (что можно было бы встроить)? Я предполагаю, что нахожу их немного странными как ненужный возврат к C (и да, я знаком с родословной Obj-C).

Это просто что-то, что было сделано в тот день, или есть определенная причина?

Ответы [ 2 ]

8 голосов
/ 19 мая 2010

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

Если вы посмотрите на определение, вы увидите, что оно использует __LINE__, __FILE__, _cmd и self из контекста, в котором оно используется. Если бы это был не макрос, он бы не имеют доступа к этой информации.

Для NSLocalizedString однако я не вижу очевидной причины.

4 голосов
/ 19 мая 2010

NSLocalizedString - это вспомогательный макрос, который, вероятно, можно сделать функцией.

Однако, есть веские причины, по которым NSAssert и друзья являются макросами, помимо той, которая приведена в ответе Георга. NSAssert оценивает логическое выражение, чтобы определить, следует ли создавать исключение. Это логическое выражение может быть довольно вычислительно дорогим и не таким, как вы хотели бы, чтобы происходило в вашем коде релиза. В C (и, следовательно, в Objective-C) нет механизма пропуска обычных вызовов функций для сборки выпуска, не прибегая к препроцессору или, возможно, не используя такие вещи, как:

if (debug)
{
    assertAsAFunction(foo == 3, "foo should be 3");
}

Другое преимущество макроса NSAssert заключается в том, что условие может быть преобразовано в строку для использования в сообщении журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...