Вы действительно можете использовать 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");
}
Что вы пытаетесь сделать с указателем? Вы не можете просто преобразовать что-то в ссылку NSObject. – Avi
@Avi, почему не может? Я нашел, что NSValue - это то, что мне нужно, но не знаю, как правильно использовать его в моем случае, поэтому я прошу здесь. –
Потому что вы используете неправильную терминологию. 'NSValue' сохраняет значение. Он не конвертируется из одного типа в другой. – Avi