NS_ENUM 和 NS_OPTIONS的区别

在苹果的一篇官方文档《Adopting Modern Objective-C》“适应现代的Objectice-c”中提及到使用NS_ENUM和NS_OPTIONS来声明枚举

NS_ENUM用来声明基于一般整形的枚举,而NS_OPTIONS一般用来声明基于位掩码的声明(bitmask)

在一般的教程书中也经常提及,但是其中的区别是什么呢?

在NSObjCRuntime.h中有如下的宏定义

[cpp] view plain copy

  1. #define NS_ENUM(_type, _name) CF_ENUM(_type, _name)

[cpp] view plain copy

  1. #define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)

就是说,NS_ENUM 、CF_ENUM是一样的,NS_OPTIONS、CF_OPTIONS是一样的

那再具体分析下CF_ENUM,CF_OPTIONS宏到底是什么东西

在CF_ENUM,CF_OPTIONS宏定义头文件CFAvailability.h中有如下的宏定义

[cpp] view plain copy

  1. #if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
  2. #define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
  3. #if (__cplusplus)
  4. #define CF_OPTIONS(_type, _name) _type _name; enum : _type
  5. #else
  6. #define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
  7. #endif
  8. #else
  9. #define CF_ENUM(_type, _name) _type _name; enum
  10. #define CF_OPTIONS(_type, _name) _type _name; enum
  11. #endif

诈一看,其实两者基本思想是没有区别的,并没有说NS_ENUM枚举的元素非得是整型,NS_OPTIONS枚举的元素非得是与位有关的,据其根本

枚举的目的是为整型数据添加一个名字罢了。NS_ENUM,NS_OPTIONS只是为了代码的统一性,约束一下编码规则罢了。

但是,仔细看的又会发现有不同,为什么有时候将宏定义为#define CF_OPTIONS(_type, _name) _type _name; enum : _type或者#define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type

StackOverflow 里面这个问题说到,但是前面几个回答似乎有点简单,没有说到重点,最后那个回到似乎很有道理

具体是说因为c++11支持了枚举的向前声明(forward declare),因而出现的bug,为兼容使用到了类如“CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type”

时间: 2024-11-05 12:31:16

NS_ENUM 和 NS_OPTIONS的区别的相关文章

iOS中特有的NS_ENUM和NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. enum{      UIViewAnimationTransitionNone,     UIViewAnimationTransitionFlipFromLeft,     UIViewAnimationTransitionFlipFromRight,     UIViewAnimationTransitionCurlUp,     UIViewAnimationTransitionCurlDown, } UIViewAnimat

NS_ENUM和NS_OPTIONS

NS_ENUM 和 NS_OPTIONS 在iOS 6 / OS X Mountain Lion才开始有,他们都是用来代替 enum 的. 借用C的写法:只定义值,不定义类型 1 enum { 2  UITableViewCellStyleDefault, 3  UITableViewCellStyleValue1, 4  UITableViewCellStyleValue2, 5  UITableViewCellStyleSubtitle 6  }; 借用C的写法:定义值的同时定义类型 1 t

NS_ENUM vs. NS_OPTIONS

NS_ENUM用于定义普通枚举值,NS_OPTIONS用于定义位移相关操作的枚举值: typedef NS_ENUM(NSUInteger, EOCConnectionState) { EOCConnectionStateDisconnected, EOCConnectionStateConnecting, EOCConnectionStateConnected, }; typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection) { EOCPerm

[email protected]的11条规范写法

总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@private关键字 1.2属性的readonly,readwrite关键字 2.前向声明 3.只暴露必要的接口和实现 3.1不要暴露任何只在类内部使用的私有方法 3.2不要在头文件里声明类内部遵循的protocol 4.nullability说明 5.定义枚举 5.1 NS_ENUM 5.2 NS_OPT

NS_ENUM & NS_OPTIONS

一切皆为对象. 其实有很多种方式你可以在面向过程和面向对象间互相转化,但本文的目的是:有时候抛弃C层面的东西也是很好的. 是的——对于这种Smalltalk一样杂交而成的语言中的非面向对象部分而言,C语言是很有魅力的一部分.它速度快.久经考验,是现代计算最核心的部分.而且当面向对象范式处于过于庞大的设计而显得臃肿不堪的时候,C就变成了你的“安全出口”. 静态函数比硬要塞入类中的方法要好. 枚举比字符串常量要好. 按位掩码比字符串常量组成的数组要好. 过程化指令比runtime hack要好. 一

iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. [cpp] view plaincopy enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, } UIViewAnimat

iOS - 枚举类型 enum,NS_ENUM,NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, } UIViewAnimationTransition; //位移操作

OC成长之路 <一> 位运算符、枚举、(原码,补码,反码)、以及NSInteger,NSUInteger,int的区别

引言: 咳咳,首先我是一枚资深小白(资深小白- -.也太衰),这个博客是自己用来记录迷糊犯二的东西. 最近发现难道是因为老了么(我明明18....),很多东西,脑子已经不记得了,迷迷糊糊,概念理论的东西脑子里面七零八落. 从一个知识点跳到另一个知识点,简直是连环事故. ??sad. 傲娇的我不服,决心要认认真真做好笔记,记录期间遇见的种种. 生活要有仪式感,学习应该也是要这样,作为Chapter 1 ,应该要起个好名字. 想了几十分钟,还是随便一些吧. 那就叫: OC成长之路 okok,来开始今

在 Swift 中实现 NS_OPTIONS

从Xcode 4.5以后,我们在Objective-C中使用NS_ENUM和NS_OPTIONS来定义一个枚举,以替代C语言枚举的定义方式.其中NS_ENUM用于定义普通的枚举,NS_OPTIONS用于定义选项类型的枚举. 而到了Swift中,枚举增加了更多的特性.它可以包含原始类型(不再局限于整型)以及相关值.正是由于这些原因,枚举在Swift中得到了更广泛的应用.在Foundation中,Objective-C中的NS_ENUM类型的枚举,都会自动转换成Swift中enum,并且更加精炼.以