Jon*_*an. 19 iphone cocoa-touch core-graphics objective-c compound-literals
我很好奇为什么像CGRectMake和CGPointMake这样的函数存在并被广泛使用.相反,你可以这样做:
(CGRect){{x, y}, {width, height}}
Run Code Online (Sandbox Code Playgroud)
肯定这是更有效的(虽然我猜不多)因为没有函数调用?
您还可以设置原点和大小,如:
(CGRect){origin, size}
Run Code Online (Sandbox Code Playgroud)
并作为混合物:
(CGRect){origin, {width, height}}
Run Code Online (Sandbox Code Playgroud)
不使用它的原因是什么,更喜欢Make功能?
Kal*_*lle 13
实际上,效率并不高.该CGRectMake
功能(及其他)被声明为static inline
,这意味着编译器复制粘贴功能代码直入每一个它的使用场所:
CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
Run Code Online (Sandbox Code Playgroud)
哪里
# define CG_INLINE static inline
Run Code Online (Sandbox Code Playgroud)
你来自
// code
CGRect myRect = CGRectMake(1,2,3,4);
// code
Run Code Online (Sandbox Code Playgroud)
至
// code
CGRect myRect;
myRect.origin.x = 1; myRect.origin.y = 2;
myRect.size.width = 3; myRect.size.height = 4;
Run Code Online (Sandbox Code Playgroud)
这原则上没有什么不同
CGRect myRect = (CGRect){1,2,3,4};
Run Code Online (Sandbox Code Playgroud)
经过编译器优化等.
如上所述,您添加依赖于CGRect
作为以某种方式对齐的4个数字的结构,而不是使用对其具有更多保证的函数.
我想这是旧的区别:
从数据结构的内部定义中添加代码中的依赖项;
使用封装该知识的函数,可以"掩盖"底层数据结构中的任何更改.
原则上,CGRect
可能演变成与它的一个成熟的类origin
,size,
等等,存取等...我不是说这将是明智的,或者它是可能的,只是为什么您使用的功能,之所以创建的实例数据结构与代码对更改的弹性有关.
C99的复合文字语法是一个有点模糊的功能.有些人发现Make函数更清晰,或者他们发现它更熟悉.在工具链支持的这个阶段,它只是偏好.
我很好奇为什么像CGRectMake和CGPointMake这样的函数存在......
CGRectMake
(自10.0起可用)在OS X的编译器支持复合文字之前.复合文字在GCC 3.1(2002年5月)正式完成.
归档时间: |
|
查看次数: |
2930 次 |
最近记录: |