使用CGPoint的object_setInstanceVariable
有谁知道如何使用object_setInstanceVariable设置结构variables? 对于参考types,它工作正常:
object_setInstanceVariable(obj, "_variable", ref);
但是不要为像CGPoint这样的结构工作。 试过以下方法:
1. object_setInstanceVariable(obj, "_variable", point); 2. object_setInstanceVariable(obj, "_variable", &point); 3. object_setInstanceVariable(obj, "_variable", (void **)&point);
我不知道我明白我在做什么(特别是最后一步)…
谢谢你提前!
object_setInstanceVariable
和object_getInstanceVariable
实际上应该只用于对象(尽pipe接口声明似乎是另有指示)。 你不应该使用这些内置的。
更合适的方法是使用class_getInstanceVariable
和ivar_getOffset
。
例如…
static void* getIvarPointer(id object, char const *name) { Ivar ivar = class_getInstanceVariable(object_getClass(object), name); if (!ivar) return 0; return (uint8_t*)(__bridge void*)object + ivar_getOffset(ivar); }
基本上把对象指针变成一个指向一个字节的指针,所以它可以被添加到偏移量(这给我们指向iVar的指针)。 我们必须首先通过void*
,因为ARC不允许直接投射到uint8_t*
。
它的使用可以这样certificate…
@implementation Foo { CGRect _rect; } - (CGRect*)rectPointer { CGRect *ptr = getIvarPointer(self, "_rect"); NSAssert(ptr == &_rect, @"runtime discovered pointer should be same as iVar pointer"); return ptr; }
现在,你有办法得到任何iVar的指针…只是适当地投下返回的void*
。
顺便说一句,我不build议这样做一般,但像任何工具,有用于运行时function。
哎呀。 忘记显示设置值…
CGRect *rectPtr = getIvarPointer(someObject, "_rect"); if (rectPtr) { *rectPtr = CGRectMake(1, 2, 3, 4); } else { // Handle error that the ivar does not exist... }
编辑
对不起,现在还不是很清楚。 我应该得到这种types(CGRect *),然后将其传递给object_setInstanceVariable? 此外,我有一个错误“未定义的符号”_getIvarPointer“” – 请让我知道什么H文件,我应该包括 – 德米特里
不,你不应该使用object_setInstanceVariable
。 它应该只用于实例variables是对象。 你的是一个CGRect,所以你不应该使用这个function。
像最后一个例子一样使用它。 也许这个更清晰一些(从你的例子中可以看出)。
而不是做你喜欢的问题:
object_setInstanceVariable(obj, "_variable", point);
做这个…
// Get a pointer to the instance variable. Returns NULL if not found. CGPoint *pointPtr = getIvarPointer(obj, "_variable"); if (pointPtr) { // Now, assign to the point, by de-referencing the pointer. *pointPtr = point; }
请注意,我将getIvarPointer
函数定义为具有本地范围的static
文件。 这不是一个苹果提供的function – 你必须写它。 如果你打算在多个地方使用这个,你需要删除static
的链接器才能find它。
好的,我find了答案。 我看看SELF地址和variables地址之间的区别:
NSLog(@"%d",self); NSLog(@"%d",&variable);
例如差异是24 – 然后我写下面的代码:
CGPoint *variable = (int)self + 24; *variable = myCGPoint;
我什至不能解释多less是肮脏的黑客! 但它的作品:)
感谢Jody的帮助,我对你做出了赞扬