使用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_setInstanceVariableobject_getInstanceVariable实际上应该只用于对象(尽pipe接口声明似乎是另有指示)。 你不应该使用这些内置的。

更合适的方法是使用class_getInstanceVariableivar_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的帮助,我对你做出了赞扬