2016-08-11 9 views
0

는 C 포인터를 포장하는?사용 NSValue 내가 C 형 포인터 변수가

NSValue을 사용해야합니까? NSValue으로 올바른 방법은 무엇입니까?

+0

을 (당신은에 NSData을 고려하십시오. 지적되고 무엇을 포장 할 경우)? NSObject 참조로 변환 할 수 없습니다. – Avi

+0

@Avi, 왜 안되니? NSValue가 필요한 것이지만 내 경우에는 NSValue를 사용하는 적절한 방법을 모르기 때문에 여기에서 질문합니다. –

+0

잘못된 용어를 사용하고 있습니다. NSValue는 값을 저장합니다. 한 유형에서 다른 유형으로 변환하지 않습니다. – Avi

답변

0

실제로 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"); 

} 
+0

고마워, 나는 그것을 곧 시도하고 다시 당신에게 돌아갈 것입니다. –

+0

흠 ... 나를 위해 작동하지 않습니다 ... 당신은 원시 타입 '이중'보다 C 타입 포인터에 대한 테스트를 해줄 수 있습니까? –

+0

C 구조체와 포인터를 사용하여 테스트로 편집 된 –

1

당신은 단순히 NSValue 객체로 포인터 값을 래핑하는 방법 valueWithPointer:를 사용, pointerValue을 사용하여 포인터 값을 추출하십시오.

이들은 valueWithInt:/intValue과 같습니다. 프리미어 값을 래핑합니다. 당신은 이 아니며 포인터가 가리키는 부분을 줄 바꿈하지 않고입니다. 따라서 포인터를 추출 할 때 포인터가 가리키는 포인터가 여전히 주위에 있는지 또는 포인터 값이 유효하지 않은지 확인하는 것이 중요합니다.

마지막으로 void *으로 반환되는 추출 포인터 값을 원래 형식으로 되돌려 보내야합니다. 귀하의 예에서는 a_c_type *입니다.

당신이 포인터와 함께 할 려

HTH