2003
01 02 03 04 05 06 07 08 09 10 11 12
2006
01 02 03 04 05 06 07 08 09 10 11 12
2007
01 02 03 04 05 06 07 08 09 10 11 12
2008
01 02 03 04 05 06 07 08 09 10 11 12
2009
01 02 03 04 05 06 07 08 09 10 11 12
2010
01 02 03 04 05 06 07 08 09 10 11 12
2011
01 02 03 04 05 06 07 08 09 10 11 12
2017
01 02 03 04 05 06 07 08 09 10 11 12
2018
01 02 03 04 05 06 07 08 09 10 11 12
 
Jun
15
2007

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。

 
 

Write Concisely