답변
실제로 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
시험이 : PTR와
- (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");
}
시험 :
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");
}
고마워, 나는 그것을 곧 시도하고 다시 당신에게 돌아갈 것입니다. –
흠 ... 나를 위해 작동하지 않습니다 ... 당신은 원시 타입 '이중'보다 C 타입 포인터에 대한 테스트를 해줄 수 있습니까? –
C 구조체와 포인터를 사용하여 테스트로 편집 된 –
당신은 단순히 NSValue
객체로 포인터 값을 래핑하는 방법 valueWithPointer:
를 사용, pointerValue
을 사용하여 포인터 값을 추출하십시오.
이들은 valueWithInt:
/intValue
등과 같습니다. 프리미어 값을 래핑합니다. 당신은 이 아니며 포인터가 가리키는 부분을 줄 바꿈하지 않고입니다. 따라서 포인터를 추출 할 때 포인터가 가리키는 포인터가 여전히 주위에 있는지 또는 포인터 값이 유효하지 않은지 확인하는 것이 중요합니다.
마지막으로 void *
으로 반환되는 추출 포인터 값을 원래 형식으로 되돌려 보내야합니다. 귀하의 예에서는 a_c_type *
입니다.
HTH
을 (당신은에
NSData
을 고려하십시오. 지적되고 무엇을 포장 할 경우)? NSObject 참조로 변환 할 수 없습니다. – Avi@Avi, 왜 안되니? NSValue가 필요한 것이지만 내 경우에는 NSValue를 사용하는 적절한 방법을 모르기 때문에 여기에서 질문합니다. –
잘못된 용어를 사용하고 있습니다. NSValue는 값을 저장합니다. 한 유형에서 다른 유형으로 변환하지 않습니다. – Avi