首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSValue包装C指针

使用NSValue包装C指针
EN

Stack Overflow用户
提问于 2016-08-11 07:39:37
回答 2查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
a_c_type *cTypePointer = [self getCTypeValue];

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

我应该使用NSValue吗?使用NSValue的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 07:46:44

您确实可以使用NSValue。

代码语言:javascript
复制
a_c_type *cTypePointer = [self getCTypeValue];
NSValue * storableunit = [NSValue valueWithBytes:cTypePointer objCType:@encode(a_c_type)];

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

回到C区:

代码语言:javascript
复制
a_c_type element;
[value getValue:&element];

注意,您将得到实际值,而不是指针。但之后,你可以

代码语言:javascript
复制
 a_c_type *cTypePointer = &element

测试它:

代码语言:javascript
复制
- (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进行测试:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-08-11 08:23:26

只需使用valueWithPointer:方法将指针值包装为NSValue对象,使用pointerValue提取指针值。

它们就像valueWithInt:/intValue等人--它们包装了原始值。您是,而不是,它封装了指针指向的内容。因此,重要的是要确保在提取指针时,它所指向的指针仍然存在,否则指针值将无效。

最后,必须将提取指针值(返回为void * )转换为它的原始类型,例如示例中的a_c_type *

(如果您想包装所指向的内容,请考虑NSData。)

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38890174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档