使用 NSValue 包装一个 C 指针
Use NSValue to wrap a C pointer
我有一个C类型的指针变量:
a_c_type *cTypePointer = [self getCTypeValue];
如何将 cTypePointer
类型转换为 NSObject
类型,反之亦然?
我应该使用 NSValue
吗? NSValue
的正确方法是什么?
你确实可以使用 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");
}
您只需使用方法 valueWithPointer:
将指针值包装为 NSValue
对象,并使用 pointerValue
提取指针值。
这些就像 valueWithInt:
/intValue
等 - 它们包装原始值。您 不是 包装指针指向的内容。因此,重要的是要确保在提取指针时它指向的任何内容仍然存在,否则指针值将无效。
最后,您必须将作为 void *
返回的提取指针值转换回其原始类型,例如a_c_type *
在你的例子中。
(如果你想包装所指向的内容,请考虑 NSData
。)
HTH
我有一个C类型的指针变量:
a_c_type *cTypePointer = [self getCTypeValue];
如何将 cTypePointer
类型转换为 NSObject
类型,反之亦然?
我应该使用 NSValue
吗? NSValue
的正确方法是什么?
你确实可以使用 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");
}
您只需使用方法 valueWithPointer:
将指针值包装为 NSValue
对象,并使用 pointerValue
提取指针值。
这些就像 valueWithInt:
/intValue
等 - 它们包装原始值。您 不是 包装指针指向的内容。因此,重要的是要确保在提取指针时它指向的任何内容仍然存在,否则指针值将无效。
最后,您必须将作为 void *
返回的提取指针值转换回其原始类型,例如a_c_type *
在你的例子中。
(如果你想包装所指向的内容,请考虑 NSData
。)
HTH