*(id *)obj的目的是什么?

时间:2012-02-09 09:39:01

标签: objective-c ios

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

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* ret = afunc(); //same without this * .
id lastValue = *(id*)ret;
//now I can use lastValue;

为什么需要这样做? 我无法理解*(id*) 还有id* ret = afunc(),当删除此星时,它也可以正常工作。

2 个答案:

答案 0 :(得分:1)

afunc引用函数(void *)wax_copyToObjc(...)。此函数的目的是将Lua对象转换为C或Objective-C值。因为它可能是原始类型或objective-c实例,所以它不知道它将返回什么。因此总是返回一个指向void的指针(意味着指向未知的指针)。在id的情况下,它将返回指向id的指针。

可能更容易解释int发生了什么,它会为int分配空间并复制其值:

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

(int *)value转换为“value是指向int的指针” 像*(int *)value一样在它前面添加*会转换为“将int复制到值指向的alloc'd内存。”

在你的例子中:

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

答案 1 :(得分:0)

这看起来很奇怪。由于问题来自C代码,我建议不要使用id。虽然它应该与void*相同,但开发人员倾向于使用ObjC代码中的第一个,而后者则使用C代码。你会获得清晰度。

现在,我不明白为什么void* value = instance;void* ret = afunc();不应该按预期执行。

相关问题