NSArray和 Vector<struct>互转

来源:互联网 发布:淘宝服务热线 人工 编辑:程序博客网 时间:2024/06/02 02:01

最近写程序的时候遇到这样的问题,需要将Vector里头的struct转存到NSArray里头。
一般遇到这种问题,常见处理是再定义一个class,然后把struct里头的内容一一搬过来,然后放到NSArray里头。这个做法虽然麻烦,但是安全,不会引起其他的问题。
我不想再重新定义一个class,再为他初始化,写属性,转存的时候一一赋值,因为实在太麻烦了,我想直接用他的struct定义。所以,我通过NSValue来做这件事情。

C类型和NSValue之间的转换

#define MyGetNSValueFromCType(cValue) ([NSValue value:&cValue withObjCType:@encode(typeof(cValue))])
#define MySetCValueFromNSValue(ocValue, cValue) [ocValue getValue:&cValue]

使用方法如下:
int count = 10;
NSValue *value = MyGetNSValueFromCType(count);
int newCount;
MySetCValueFromNSValue(value, newCount);

VectorNSArray之间的转化
#define MyGetArrayFromVector(vec) ({\
NSMutableArray *arr = [NSMutableArray array];\
for(int i = 0; i < vec.size(); i++)\
{\
NSValue *value = MyGetNSValueFromCType(vec[i]);\
if (value != nil)\
[arr addObject:value];\
}\
[arr count] == 0 ? nil : arr;\
})

#define MySetVectorFromArray(vec, type, arr) {\
for(int i = 0; i < [arr count]; i++)\
{\
type _value;\
MySetCValueFromNSValue([arr objectAtIndex:i], _value);\
vec.push_back(_value);\
}\
}

使用方法:
struct hello
{
int a;
int b;
};

vector<hello> aVector;
hello a;
a.a = 10;
a.b = 100;

hello b;
b.a = 20;
b.b = 200;

aVector.push_back(a);
aVector.push_back(b);
NSArray *myArr = NdGetArrayFromVector(aVector);

vector<hello> bVector;
NdSetVectorFromArray(bVector, hello, myArr);

注意:
这里的struct里头的成员类型只能是C语言的基础类型,不能是string,vector这些C++的类!因为它们不是简单的内存块,转换后的 NSValue很容易出现依赖于原对象的内存的状况。(如果您仅在当前函数内使用转换后的对象,倒是没有问题的,但是这种需求应该不会出现吧^_^)

本文出自 “风沙” 博客,请务必保留此出处http://kensou.blog.51cto.com/3495587/658222

原创粉丝点击