object_getInstanceVariable
根據 OSX 10.4.8 (ppc) 裡面的 objc4-267.1 的 source code 來看,以下是 object_getInstanceVariable 的實做:
Ivar object_getInstanceVariable(id obj, const char *name, void **value)
{
Ivar ivar = 0;
if (obj && name) {
void **ivaridx;
if ((ivar = class_getInstanceVariable(((Object*)obj)->isa, name))) {
ivaridx = (void **)((char *)obj + ivar->ivar_offset);
*value = *ivaridx;
} else
*value = 0;
}
return ivar;
}
ADC reference 裡面講得不清不楚,幸好 Apple 有 open source ,這樣一來完全了解了。原來 object_getInstanceVariable 只能用來抓 pointer type 的 instance variable!欲抓 primitive type 的 ivar ,只能硬去 dereference (char *)self + Ivar->ivar_offset 。之前在網路上找資料,有人說 object_getInstanceVariable 出來的結果不是把 pointer to instance variable 存到 value 裡,而是直接把 instance variable 存到 value 裡。這種說法完全是結果論,反而讓我混淆了。因此你大概可以想像到我做了怎麼樣的事導致 MulderPatch 無法在 intel 上讀到滑鼠選取範圍,所以無法做彩色剪貼。在 ppc 上, Big Endian 讓我很幸運沒踩到地雷,不過 X86 的 Little Endian 就讓我潰爛了。
這應該是 Apple 的陳年老 bug。話說一般人可以 commit patch 嗎?還是只能 file a bug ?