美文网首页DevSupport
【OC梳理】结构体、枚举

【OC梳理】结构体、枚举

作者: 忠橙_g | 来源:发表于2017-11-15 17:37 被阅读50次

结构体(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梳理】结构体、枚举

    结构体(struct) OC中的结构体(struct),其实就是C语言中的结构体(struct)常见使用方法。OC...

  • swift3.0- 枚举

    Swift枚举 Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样...

  • 枚举

    Swift枚举:Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样...

  • Swift枚举

    枚举简单认识 Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样增...

  • swift方法

    oc中只有类可以定义方法,swift类/结构体/枚举都能定义方法 swift的类型方法类似oc的类方法 实例方法(...

  • Swift中 enum,struct,class总结

    swift中的枚举和结构体都比OC中增加了一定的灵活性,但本质并未改变 1. 枚举 定义方式和OC略有不同,前面要...

  • [Swift5.1] 18-扩展

    扩展(Extension) Swift中的扩展,有点类似于OC中的分类(Category) 扩展可以为枚举、结构体...

  • 扩展

    扩展(Extension) Swift中的扩展,有点类似于OC中的分类(Category) 扩展可以为枚举、结构体...

  • Swift 单例

    OC中单例的实现: Swift 单例的实现: 注意: 1.Apple 文档指出:全局变量和结构体/枚举体的静态成员...

  • iOS - 属性关键字的使用无标题文章

    一、 assign + ‘基本数据类型’、‘枚举’、‘结构体’ 等非OC对象类型 二、 weak 一般应用: UI...

网友评论

    本文标题:【OC梳理】结构体、枚举

    本文链接:https://www.haomeiwen.com/subject/orzcvxtx.html