NSMutableArray中存放struct以及NSValue详解

IOS中的可变数组NSMutableArray里面存放的内容需要是NSObject以及所有基于NSObject类的对象,如果有C/C++中定义的标准类型如int需要存放在NSMutableArray就要进行对应的转换。int型我们可以使用NSNumber转换,而如果需要将struct结构存放在NSMutableArray,该如何处理呢?
这种情况我们需要借助IOS中的NSValue对象。
情景如下:
假设有如下C语言结构体:
struct Tekuba_Net 
{   unsigned char value1;
    float value2;
    int value3;
};
tekuba_Net结构存放在NSMutableArray类型tekubaArray数组中代码清单如下:
struct Tekuba_Net tekuba_Net;
tekuba_Net.value1='1';
tekuba_Net.value2=2.0;
tekuba_Net.value3=2;
//将struct对象装入到NSArray中
[tekubaArray addObject:[NSValue value:&tekuba_Net withObjCType:@encode(struct Tekuba_Net)]];
从tekubaArray数组中恢复Tekuba_Net元素的代码清单如下:
struct Tekuba_Net tekuba_Net;
[[tekubaArray objectAtIndex:0] getValue:&tekuba_Net];
分析:
1,NSValue类型
NSValue是用来存储一个C/C++或者Objective-C数据的容器类 。它可以保存任意类型的数据,比如C/C++标准的int,float,char等,当然也可以是指针,结构,以及Object-C的对象。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里。
2,使用NSValue需要注意的问题
你不可以存储C字符串,不定长数组/结构和其他的一些不定长的数据类型到NSValue中.
你应该使用NSString或者NSData来存储此类不定长数据。当然你可以把一个指向变长对象的指针存储在NSValue对象中。
如果你的数据不是定长的会发生什么?请看如下结构:
typedef _Tekuba_Net 
{
int dataSize;
char *data;
}Tekuba_Net;
当data指向一个字符数组时,它是变长的,所以它指向的数据不会被编码,只有这个指针地址被编码了。所以不要期望它能存储你的data。你应该使用NSData或者NSArchiver来代替NSValue以达到期望目的。
再看下面例子:
typedef struct1 {
int month;
int day;
} Tekuba_Net;
typedef struct2 {
int dataSize;
Tekuba_Net *tekuba_Net;
} myTekuba_net;
Tekuba_Net是一个定长的类型变量,Tekuba_Net能被NSValue正确编码.而myTekuba_net中包含有指针就不能被NSVaule编码,在这种情况下,需要使用NSData。
总之, 使用NSValue存放结构只能存放那些没有指针变量的结构。
3,NSValue其他的操作
@interface NSValue (NSValueUIGeometryExtensions)   
+ (NSValue *)valueWithPointer:(const void *)pointer;//保存对象指针   
+ (NSValue *)valueWithCGPoint:(CGPoint)point;//保存CGPoint结构体   
+ (NSValue *)valueWithCGSize:(CGSize)size;//保存CGSize结构体   
+ (NSValue *)valueWithCGRect:(CGRect)rect;//保存CGRect结构体   
+ (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;   
+ (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;   
    
- (void *)pointerValue;   
- (CGPoint)CGPointValue;   
- (CGSize)CGSizeValue;   
- (CGRect)CGRectValue;   
- (CGAffineTransform)CGAffineTransformValue;   
- (UIEdgeInsets)UIEdgeInsetsValue;
@end 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值