19

Ich bin neugierig, warum Funktionen wie CGRectMake und CGPointMake existieren und weit verbreitet sind. , wenn statt, können Sie tun:Warum Funktionen wie CGRectMake verwenden?

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

sicherlich dieses effizienten ist (obwohl ich nicht viel zu raten), da es kein Funktionsaufruf?

Auch können Sie die Herkunft und Größe wie festgelegt:

(CGRect){origin, size} 

und als Mischung:

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

Was ist der Grund hierfür nicht verwendet wird, und lieber die Make-Funktionen?

Antwort

8

Ich nehme an, es ist der gleiche alte Unterschied zwischen:

  1. einer Abhängigkeit in Ihnen Code aus der internen Definition einer Datenstruktur hinzugefügt;

  2. mit einer Funktion, die dieses Wissen einkapselt und die Änderungen in der zugrunde liegenden Datenstruktur "maskieren" könnte.

Grundsätzlich CGRect könnte in eine ausgewachsene Klasse entwickeln sich mit seiner origin, size, etc, Accessoren, etc ... Ich sage nicht, diese sinnvoll wäre oder dass es wahrscheinlich ist, nur dass der Grund, Warum Sie eine Funktion verwenden, um Instanzen einer Datenstruktur zu erstellen, hängt mit der Widerstandsfähigkeit Ihres Codes gegenüber Änderungen zusammen.

13

Es ist nicht effizienter, eigentlich. Die CGRectMake Funktion (und andere) als static inline erklärt, die den Compiler Kopie bedeutet, fügt den Funktionscode direkt in jedem Ort, es verwendet wird:

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

wo

# define CG_INLINE static inline 

Sie gehen von

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

bis

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

grundsätzlich die von

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

nach Compiler-Optimierungen und so nicht anders.

Wie oben erwähnt, fügen Sie eine Abhängigkeit von CGRect eine Struktur von 4 Zahlen auf eine bestimmte Weise ausgerichtet im Gegensatz zu einer Funktion, die mehr Garantie dafür hat.

6

C99s zusammengesetzte literale Syntax ist eine etwas obskure Funktion. Manche Leute finden die Make-Funktionen klarer zu lesen, oder sie finden sie vertrauter. In diesem Stadium der Toolchain-Unterstützung ist es lediglich eine Vorliebe.

Ich bin neugierig, warum Funktionen wie CGRectMake und CGPointMake existieren ...

CGRectMake (verfügbar seit 10.0) voran Unterstützung des OS X-Compiler der Verbindung Literale. Zusammengesetzte Literale wurden offiziell in GCC 3.1 (Mai 2002) abgeschlossen.