19

Jestem ciekawy, dlaczego funkcje takie jak CGRectMake i CGPointMake istnieją i są szeroko stosowane. kiedy zamiast tego można zrobić:Dlaczego warto korzystać z funkcji takich jak CGRectMake?

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

pewno jest to bardziej wydajny (choć nie jestem zgadywania przez wiele), ponieważ nie ma wywołanie funkcji?

Ponadto można ustawić punkt początkowy i rozmiar jak:

(CGRect){origin, size} 

i jako mieszanina:

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

Co jest powodem tego nie jest używany, a preferując funkcje zarobić?

Odpowiedz

8

Przypuszczam, że jest to ten sam stary różnica pomiędzy:

  1. dodając zależność w ciebie kodu z wewnętrznej definicji struktury danych;

  2. za pomocą funkcji, która hermetyzuje tę wiedzę i która może "maskować" wszelkie zmiany w podstawowej strukturze danych.

W zasadzie CGRect może przekształci się w pełnowymiarową klasie z jego origin, size, itp akcesorów, etc ... Nie mówię, że to byłoby rozsądne lub że jest prawdopodobne, tylko, że powodem dlaczego funkcja tworzenia instancji struktury danych ma związek z odpornością kodu na zmiany.

13

To nie jest bardziej efektywne. CGRectMake function (i inne) są zadeklarowane jako static inline, co oznacza kopii kompilatora wkleja kod funkcji prosto w każdym miejscu to służy:

CG_INLINE CGRect 
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) 

gdzie

# define CG_INLINE static inline 

Idziesz z

// code 
CGRect myRect = CGRectMake(1,2,3,4); 
// code 

do

// code 
CGRect myRect; 
myRect.origin.x = 1; myRect.origin.y = 2; 
myRect.size.width = 3; myRect.size.height = 4; 

które w zasadzie nie różni się od

CGRect myRect = (CGRect){1,2,3,4}; 

po optymalizacje kompilatora i takie.

Jak wspomniano powyżej, dodawanie zależności od CGRect jest strukturą z 4 liczb wyrównanych w określony sposób, w przeciwieństwie do korzystania z funkcji, która ma dla niej większą gwarancję.

6

Składnia literacka złożona z C99 to pewna niejasna funkcja . Niektórzy uważają, że funkcje Make są bardziej czytelne, aby je przeczytać, lub są bardziej znane. Na tym etapie wsparcia dla toolchain jest to tylko preferencja.

Jestem ciekaw dlaczego funkcje, takie jak CGRectMake i CGPointMake istnieje ...

CGRectMake (dostępny od 10,0) poprzedzone wsparcie OS X jest kompilator literałów złożonych. Literały złożone zostały oficjalnie ukończone w GCC 3.1 (maj 2002).