Зачем использовать такие функции, как CGRectMake?
Мне любопытно, почему такие функции, как CGRectMake и CGPointMake, существуют и широко используются.
когда вместо этого вы можете сделать:
(CGRect){{x, y}, {width, height}}
уверен, что это более эффективно (хотя я предполагаю не много), поскольку вызов функции отсутствует?
Также вы можете установить источник и размер, например:
(CGRect){origin, size}
и в виде смеси:
(CGRect){origin, {width, height}}
В чем причина не использования этого и предпочитающих функции Make?
Ответы
Ответ 1
Это не более эффективно, на самом деле. Функция CGRectMake
(и другие) объявляется как static inline
, что означает, что копия компилятора вставляет код функции прямо во все используемые места:
CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
где
# define CG_INLINE static inline
Вы переходите от
// code
CGRect myRect = CGRectMake(1,2,3,4);
// code
к
// code
CGRect myRect;
myRect.origin.x = 1; myRect.origin.y = 2;
myRect.size.width = 3; myRect.size.height = 4;
который в принципе ничем не отличается от
CGRect myRect = (CGRect){1,2,3,4};
после оптимизации компилятора и т.д.
Как сказано выше, вы добавляете зависимость от CGRect
, являющуюся структурой из четырех чисел, выровненных определенным образом, в отличие от использования функции, которая имеет большую гарантию на нее.
Ответ 2
Я полагаю, что это то же самое старое различие между:
-
добавление зависимостей в ваш код из внутреннего определения структуры данных;
-
используя функцию, которая инкапсулирует это знание и которая может "маскировать" любые изменения в базовой структуре данных.
В принципе, CGRect
может превратиться в полномасштабный класс с его origin
, size,
и т.д., аксессуарами и т.д.... Я не говорю, что это было бы разумно или что это, скорее всего, причина, по которой вы используете функцию для создания экземпляров структуры данных, связана с отказом вашего кода на изменения.
Ответ 3
C99 Компонентный синтаксис букв - несколько неясная особенность. Некоторые люди находят, что функции "Сделать" более понятны, или они считают его более знакомым. На этом этапе в поддержке инструментальной привязки это просто предпочтение.
Мне любопытно, почему существуют такие функции, как CGRectMake и CGPointMake...
CGRectMake
(доступный с 10.0) предшествовал поддержке компилятора OS X составных литералов. Компонентные литералы были официально завершены в GCC 3.1 (май 2002 г.).