Подтвердить что ты не робот

Зачем использовать такие функции, как CGRectMake?

Мне любопытно, почему такие функции, как CGRectMake и CGPointMake, существуют и широко используются. когда вместо этого вы можете сделать:

(CGRect){{x, y}, {width, height}}

уверен, что это более эффективно (хотя я предполагаю не много), поскольку вызов функции отсутствует?

Также вы можете установить источник и размер, например:

 (CGRect){origin, size}

и в виде смеси:

 (CGRect){origin, {width, height}}

В чем причина не использования этого и предпочитающих функции Make?

4b9b3361

Ответ 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 г.).