2016-08-11 2 views
0

У меня есть C переменная указателя типа:Используйте NSValue, чтобы обернуть указатель C

a_c_type *cTypePointer = [self getCTypeValue]; 

Как я могу преобразовать cTypePointer к NSObject типа & наоборот?

Должен ли я использовать NSValue? Каков правильный способ сделать это с помощью NSValue?

+0

Что вы пытаетесь сделать с указателем? Вы не можете просто преобразовать что-то в ссылку NSObject. – Avi

+0

@Avi, почему не может? Я нашел, что 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 

Попробуй:

- (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"); 

} 
+0

Спасибо, я попробую скоро и вернусь к вам. –

+0

Хмм ... это не работает для меня ... не могли бы вы сделать тест на указатель типа c, чем примитивный тип «double»? –

+0

Ответ отредактирован с помощью теста с использованием строковых и указателей C –

1

Вы просто использовать метод valueWithPointer: обернуть значение указателя в качестве NSValue объекта, и pointerValue, чтобы извлечь значение указателя.

Это как valueWithInt:/intValueи др. - они обертывают примитивное значение. Вы не упаковка, на что указывает указатель. Поэтому важно убедиться, что при извлечении указателя все, что указало на него, все равно, или значение указателя будет недействительным.

И, наконец, вы должны указать значение указателя на извлечение, которое возвращается как void *, для его первоначального типа, например. a_c_type * в вашем примере.

(Если вы хотите, чтобы обернуть, что в настоящее время направлен на NSData рассмотреть.)

HTH