基本类型
布尔型
布尔型主要有两种使用方式:
| |
上面的两种方式不是等价的,前者是通过下面的方式实现的:
| |
整数型
除了 C 中实现的整数和无符号整数,OC 同样也实现了两个整数类型:
| |
同样也可以看看他们的实现方式:
| |
数字封装
Objective-C 对数字进行了一个类的封装 NSNumber。
- 在 c/c++ 中,当需要使用数字的时候,我们通常使用简单数据类型,如:
int、long、float。 - 然而,在实际开发过程中,我们经常会遇到需要使用对象的场景。所以
Objective-C中提供了NSNumber类用来包装简单数字类型。
它封装了一些比较有用的创建方法,下面是一些例子:
| |
重载了 @ 符号进行赋值(语法糖):
| |
PostScript:
NSNumber这个类不能进行数值运算。
字符串
Objective-C 作为同样也是支持 C 中的字符串定义语法(单引号指定单个字符,双引号指定字符串),然而大部分 Objective-C 程序是使用一个字符串类的封装:
| |
可以看到声名一个字面量的字符串类型要做的事情,只是在字符串之前加上一个 @ 符号。
枚举类型
参考资料:https://www.jianshu.com/p/994dc9f4958d
在传统的 c 枚举类型中,使用 typedef 可以使枚举变量的声明更加简单:
| |
c++11 标准中对枚举类型标准进行了扩充,可以指明枚举的底层数据类型。比如:
| |
问题是这种标准并不支持使用上面描述的 typedef 语法。
Objective-C 最常用的枚举数据类型 NS_ENUM 与 NS_OPTION 为了解决这个问题诞生:
NS_ENUM是一个宏,是对 c++ 中的枚举类型的上层封装。比如下面的一个NS_ENUM使用实例:1 2 3 4 5 6 7 8 9typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, }; UIViewAnimationTransition trans = UIViewAnimationTransitionNone;如果编译器支持新标准枚举则上面的定义,展开之后形成下面的代码:
1 2 3 4 5 6 7 8 9typedef enum UIViewAnimationTransition:NSInteger UIViewAnimationTransition; enum UIViewAnimationTransition: NSInteger{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, };如果编译器不支持这种语法,那么这种声明与最开始列举的
typedef是一样的。NS_OPTIONS也是一个枚举类型,它可以用于将特征存储在整数的不同比特位上。比如下面这个:1 2 3 4 5 6 7 8 9 10 11typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5 }; NSUInteger resize = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
PostScript:
- 在
Objective-C 2.0中,提供了for-in循环遍历枚举类型,称为快速枚举。
其他基本数据类型
其他数据类型基本与 c 中的语法一样。比如:
| |
类相关数据类型
在引入类的概念的时候,不同于 c++ 的一些特殊的类型:
instancetype:是clang关键字,使方法返回所在类的类型,只能用作方法返回类型。id:指代任何位置类型的NSObject对象,类似于void*。nil:表示指向的对象指针为空,类似于 c++ 中的nullptr。
控制流
循环、条件跳转,都与 c 中的相同。
消息传递
Objective-C 里,与其说对象互相调用方法,不如说对象之间互相传递消息更为精确。此二种风格的主要差异在于 调用方法/消息传递 这个动作:
- C++ 里类别与方法的关系严格清楚,一个方法必定属于一个类别,而且在编译时(compile time)就已经紧密绑定,不可能调用一个不存在类别里的方法。
- 但在Objective-C,类别与消息的关系比较松散,调用方法视为对对象发送消息,所有方法都被视为对消息的回应。所有消息处理直到运行时(runtime)才会动态决定,并交由类别自行决定如何处理收到的消息。也就是说,一个类别不保证一定会回应收到的消息,如果类别收到了一个无法处理的消息,程序只会抛出异常,不会出错或崩溃。
比如 C++ 里,送一个消息给对象(或者说调用一个方法)的语法如下:
| |
Objective-C 中则写成:
| |
此二者并不仅仅是语法上的差异,还有基本行为上的不同。