使用NSValue包装C指针

时间:2016-08-11 07:39:38

标签: ios objective-c nsobject nsvalue

我有一个C类型的指针变量:

a_c_type *cTypePointer = [self getCTypeValue];

如何将cTypePointer转换为NSObject类型&反之亦然?

我应该使用NSValue吗?使用NSValue进行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您确实可以使用NSValue。

a_c_type *cTypePointer = [self getCTypeValue];
NSValue * storableunit = [NSValue valueWithBytes:cTypePointer objCType:@encode(a_c_type)];

请注意,第一个参数是指针(void *)。该对象将包含指向的值。

回到C:

a_c_type element;
[value getValue:&element];

请注意,您将获得实际值,而不是指针。但是,你可以

 a_c_type *cTypePointer = &element

测试它:

- (void) testCVal
{
    double save = 5.2;
    NSValue * storageObjC = [NSValue valueWithBytes:&save objCType:@encode(double)];


    double restore;
    [storageObjC getValue:&restore];

    XCTAssert(restore == save, @"restore should be equal to the saved value");

}

用ptr测试:

typedef struct
{
    NSInteger day;
    NSInteger month;
    NSInteger year;
} CDate;

- (void) testCVal
{
    CDate save = (CDate){8, 10, 2016};
    CDate* savePtr = &save;

    NSValue * storageObjC = [NSValue valueWithBytes:savePtr objCType:@encode(CDate)];


    CDate restore;
    [storageObjC getValue:&restore];
    CDate* restorePtr = &restore;

    XCTAssert(restorePtr->day == savePtr->day && restorePtr->month == savePtr->month && restorePtr->year == savePtr->year, @"restore should be equal to the saved value");

}

答案 1 :(得分:1)

您只需使用方法@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 将指针值包装为valueWithPointer:对象,并使用NSValue提取指针值。

这些就像pointerValue / valueWithInt: - 它们包装了原始值。你包装指针指向的内容。因此,重要的是确保在提取指针时指向它所指向的任何内容仍然存在,否则指针值将无效。

最后,您必须将提取指针值(作为intValue返回)转换回其原始类型,例如在你的例子中void *

(如果你想把a_c_type *所指的内容包起来。)

HTH