Objective-C 数据类总结

基础的东西往往才是最重要的东西,在项目开展过程中,有时候会发现一个牢固的基础才是高效开发的关键。本次对 Objective-C 的各种常用数据类型进行总结和对比。

由于 Objective-C 本身是 C 语言的超集,所有所有 C 语言支持的基本数据类型,Objective-C 同样支持,并且 Objective-C 还支持其他一些常用数据类型,可避免不同机器位宽不同带来的麻烦。

int 与 NSInteger

C 语言中的 int,在 Objective-C 中同样支持,但不建议用 int,而推荐使用 Cocoa 框架中的 NSInteger,贴上官方详细定义:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

为了同时匹配 64 位和 32 位处理器,在上面官方框架的代码中我们看到,64 位内核中 NSInteger 为long型,而在 32位内核中为 int 型。使用 NSInteger,就不用特意去考虑内核位宽问题。

bool 与 BOOL

C 语言标准中没有布尔型变量,C++中的bool类型,为true和false,这在许多其他的类 C 语言中都是一样的,例如java、C#、php等,但在 ObjC 中,可以使用 bool 类型,但更建议使用 ObjC 专用的 BOOL 类型,这个基本布尔型的值为YES和NO。

这里写图片描述

float 与 CGFloat

CGFloat 不是 Foundation 框架的基础变量,而是定义在UIKit框架中,CG 代表 CoreGraphic(核心绘图框架)。从定义来看,float 和 CGFloa t的区别也是根据系统内核位宽不同,类型不同。

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif

/* Definition of the `CGFloat' type and `CGFLOAT_DEFINED'. */

typedef CGFLOAT_TYPE CGFloat;

可以看到,64位中 CGFloat 是 double类型,32 位中则是 float 类型。

NSString 字符串类

char 和 string 类型在 ObjC 中同样可用,但是基本也可以不用。NSString 作为整个 Cocoa 框架的灵魂类,强大无比,基本能胜任现代编程语言对于字符串的所有基本处理和更复杂的处理。

NSString 类,不需要alloc和init,Cocoa 框架高度优化了 NSString 类,让他在实例化时操作起来就好像基本类型一样。对于NSString类型来说,等号赋值,实际是深度拷贝(copy)。

另外NSString类,本身支持与许多基本类型的互转:

 //CGPoint 点转字符串
 NSString *NSStringFromCGPoint(CGPoint point);
 //CGVector 向量转字符串
 NSString *NSStringFromCGVector(CGVector vector);
 //CGSize 大小转字符串
 NSString *NSStringFromCGSize(CGSize size);
 //矩形转字符串
 NSString *NSStringFromCGRect(CGRect rect);
 //矩阵变换转字符串
 NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
 //边界转字符串
 NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
 //位移转字符串
 NSString *NSStringFromUIOffset(UIOffset offset);

//上面的逆向方法
 CGPoint CGPointFromString(NSString *string);
 CGVector CGVectorFromString(NSString *string);
 CGSize CGSizeFromString(NSString *string);
 CGRect CGRectFromString(NSString *string);
 CGAffineTransform CGAffineTransformFromString(NSString *string);
 UIEdgeInsets UIEdgeInsetsFromString(NSString *string);
 UIOffset UIOffsetFromString(NSString *string);

当然,NSString也可以转数字(基本数据类型)

NSString* number = @"1111113";
NSInteger intValue = [number integerValue]; //转整形
CGFloat   floatValue = [number doubleValue]; //转浮点

基本数据类型转化为字符串类型

NSString *intString = [NSString stringWithFormat:@"%d", intValue];

NSString *floatString = [NSString stringWithFormat:@"%f", floatValue];

NSValue , NSNumber , NSData

NSValue 主要用来封装自定义的数据结构。它可以保存任意类型的数据,比如 int,float,char,当然也可以是指 pointer, structure, and object id。NSValue 类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如 NSArray 或者 NSSet 的实例。

NSNumber 主要是用来封装 ANSI C 内置的数据,比如 char,float,int 等等。是 NSValue 的子类,支持和基本数据类型的互转。

另外 NSNumber 支持和 NSString 一样的@符号简写

NSNumber * number = @(123);
NSNumber * number1 = @(3.1415);
NSNumber * number2 = @(YES);

NSInteger intValue = [number integerValue];
CGFloat floatValue = [number1 doubleValue];
BOOL boolValue = [number2 boolValue];

NSData 主要是提供一块原始数据的封装,方便数据的封装与流动,比较常见的是 NSString/NSImage 数据的封装与传递。在应用中,最常用于访问存储在文件中或者网络资源中的数据。

NSData 根本关心传递的内容到底是什么,仅仅是传递一块内存 —— 仅需内存的起始地址和长度。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值