2012-02-09 3 views
3
typedef struct _wax_instance_userdata { 
    id instance; 
    BOOL isClass; 
    Class isSuper; 
    BOOL actAsSuper; 
} wax_instance_userdata; 

https://github.com/probablycorey/wax/blob/master/lib/wax_helpers.m#L497* (id *) obj의 목적은 무엇입니까?

id* ret = afunc(); //same without this * . 
id lastValue = *(id*)ret; 
//now I can use lastValue; 

void* afunc(){ // the function is too long 
    void *value = nil; 
    // ... 
    wax_instance_userdata *instanceUserdata = (wax_instance_userdata *)luaL_checkudata(L, stackIndex, WAX_INSTANCE_METATABLE_NAME); 

    instance = instanceUserdata->instance; 

    *(id *)value = instance; 
    return value; 
} 

https://github.com/probablycorey/wax/blob/master/lib/wax.m#L243 왜 이렇게해야합니까? 나는 *(id*) id* ret = afunc()도 이해할 수 없지만이 별을 삭제하면 잘 작동합니다.

답변

1

afunc는 (void *) wax_copyToObjc (...) 함수를 참조합니다. 이 함수의 목적은 루아 객체를 C 또는 Objective-C 값으로 변환하는 것입니다. 그것은 원시 타입이거나 객관적인 인스턴스 일 수 있기 때문에 반환 할 내용을 모릅니다. 그래서 항상 void (알 수없는 것에 대한 포인터를 의미)에 대한 포인터를 반환합니다. id의 경우에는 id에 대한 포인터를 반환합니다.

int로 함께 일어나고, 그것은 인터넷 용 공간을 ALLOC 무슨 설명하고 그 값을 복사하는 것이 더 쉬울 수 있습니다 :

value = calloc(sizeof(int), 1) 
*(int *)value = lua_tointeger(L, stackIndex) 

(INT의 *) 값이이 변환 값이 포인터 "를 int에 " 앞에 *를 추가하면 *(int *)value처럼"값을 가리키는 메모리가 할당 된 메모리로 int를 복사합니다. "

id *ret = afunc(); // returns a pointer to an id 
id lastValue = *(id*)ret; // dereferences the pointer to id so it is just an id 
0

이상하게 보입니다. 문제는 C 코드와 비슷한 것으로부터 왔기 때문에 id을 사용하지 않는 것이 좋습니다. void*과 같아야하지만 devs는 ObjC 코드에서 첫 번째 코드를 사용하고 C 코드에서는 후자를 사용하는 경향이 있습니다. 당신은 명확하게 얻을 것입니다.

지금은 void* value = instance;void* ret = afunc();이 예상대로 작동하지 않아야하는 이유가 없습니다.

+0

https://github.com/probablycorey/wax/blob/master/lib/wax_helpers.m#L497 (라인 497) https://github.com/probablycorey : 당신의 예에서

/wax/blob/master/lib/wax.m#L243 (line 243) – kran

+0

코드는 분명히 Objective-C이므로 평범한 C에는 'id'가 없습니다. –

+0

알아. 제가 말한 의미는 대개 C 조각에서 사람들은 일관성을 위해'void * '를 선호하여'id'를 버리는 경향이 있다는 것입니다. 내가 놓친 것은 이것이 자신의 코드가 아니라는 것입니다. 다음 번에는 원래 질문을 읽는 데 더 많은 시간을 할애 할 것입니다. – ksol

관련 문제