【OC梳理】结构体、枚举

结构体(struct)

OC中的结构体(struct),其实就是C语言中的结构体(struct)常见使用方法。
OC中结构体非常常见,比如说我们经常用到的CGPoint、CGRect等等。
下面我们来分析一下CGPoint这个结构体。
在CoreGraphics/CGGeometry.h文件中,我们看到CGPoint的定义如下:

/* Points. */
struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CG_BOXABLE CGPoint CGPoint;

使用typedef是为了输入时可以直接使用CGPoint而不必再输入struct。
如果没有CG_BOXABLE的话,这就是一个普通的结构体定义,CG_BOXABLE是什么呢。
在CoreGraphics/CGBase.h中,有这样的定义:

#if defined(__has_attribute) && __has_attribute(objc_boxable)
# define CG_BOXABLE __attribute__((objc_boxable))
#else
# define CG_BOXABLE
#endif

可以看到 其实是__attribute__((objc_boxable)),它可以允许将结构体进行快速打包,这样我们就可以使用@()快速地将它转换成NSValue了。
关于__attribute__,这里有一篇比较详细的文章:attribute 总结
平时我们使用的CGPointMake,它的实现方法如下:

CG_INLINE CGPoint CGPointMake(CGFloat x, CGFloat y);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CG_INLINE CGPoint
CGPointMake(CGFloat x, CGFloat y)
{
  CGPoint p; p.x = x; p.y = y; return p;
}

这里的CG_INLINE,其定义为:

#if !defined(CG_INLINE)
# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#  define CG_INLINE static inline
# elif defined(__cplusplus)
#  define CG_INLINE static inline
# elif defined(__GNUC__)
#  define CG_INLINE static __inline__
# else
#  define CG_INLINE static    
# endif
#endif

我们可以简单的理解成它就是static inline。
inline即内联函数,它的作用类似预处理指令,在编译的时候,会把代码直接嵌入调用代码中,这就省去了函数之间相互调用的时间开销。
一些简单的封装接口函数,如果仅仅是为了封装一个接口,我们不希望耗费一次函数调用的时间,解决方法可以是宏,但是作为接口,宏不够清晰,所以选择inline。

我们经常可以把希望全局使用又希望增加效率的函数实现在头文件中static inline。

枚举

枚举,也是C语言就有的功能之一。
关于枚举的定义和使用,iOS 枚举用法分析这篇文章以及介绍的比较详细了。
需要注意的是,在switch语句中处理枚举类型时,若非特殊情况,最好不要实现default分支。这样的话,当在枚举中加入新的枚举之后,编辑器会有所提示,以免忘记处理新的情况。

你可能感兴趣的:(【OC梳理】结构体、枚举)