- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有谁知道如何使用 object_setInstanceVariable 设置结构变量?它适用于引用类型:
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
实际上应该只用于对象(尽管接口(interface)声明似乎另有说明)。您不应该将它们用于内置函数。
更合适的方法是使用 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*
。
它的用途可以这样证明...
@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*
。
顺便说一句,我一般不建议这样做,但与任何工具一样,运行时功能也有用途。
糟糕。忘记显示设置值...
CGRect *rectPtr = getIvarPointer(someObject, "_rect");
if (rectPtr) {
*rectPtr = CGRectMake(1, 2, 3, 4);
} else {
// Handle error that the ivar does not exist...
}
编辑
I'm sorry, it's still not really clear. Should I get this type (CGRect*) and then pass it to object_setInstanceVariable? Also, I have an error "Undefined symbols "_getIvarPointer"" - please let me know what H file should I include – Dmitry
没有。您根本不应该使用 object_setInstanceVariable
。它应该仅用于作为对象的实例变量。你的是 CGRect,所以你根本不应该使用那个函数。
像最后一个例子一样使用它。也许这个更清楚一点(它取自您的示例)。
而不是做你问的问题:
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
。它不是 apple 提供的函数——您必须自己编写。如果你打算在多个地方使用它,你需要删除 static
以便链接器可以找到它。
关于ios - object_setInstanceVariable 与 CGPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265083/
在我的应用程序中,我有两个按钮和一个每秒触发一个操作的计时器。每秒,它生成四个随机数。这些数字用作按钮的 X 和 Y 值,并且按钮移动到新的点。然而,有时新点很接近,因此按钮会重叠。我如何检查以确保不
我计算两个 CGPoint 之间的角度: //calculate radian and degree CGPoint diff = ccpSub(center, locatio
我想在两点之间的弧线上显示图像。我有一个起始 CGPoint 和一个结束 CGPoint。我已经使用 SceneKit 和其他生成整个拱门和图表的答案看到了类似这样的答案。我只是在常规 View 中工
好的,我想将 CGPoint(A) 围绕 CGPoint(B) 旋转 50 度,有什么好的方法吗? CGPoint(A) = CGPoint(x: 50, y: 100) CGPoint(B) = C
我正在生成一些位置随机的圆圈。我要防止的是圆圈相互重叠。所以我想将新生成的 CGPoint 值与数组中的值进行比较,如果该值位于其中一个 CGPoint 的半径区域中,则让它生成一个新值。 除了重叠的
我有一个使用函数 addCurveToPoint 由 CGPoint 数组组成的 UIBezierPath,这里是一些代码: UIBezierPath *path = [[UIBezierPath a
我正在尝试使用两个 UIButton。一个距离它们所在的 UIView 边缘 8 点,第二个距离第一个开始 4 点。我现在正在做这个 let buttonFrames: CGSize = CG
我有一个使用 Core Graphics 的绘图应用程序。一切正常。我会画画。我添加了一个“撤消”按钮来撤消该行。它有效,但是...... 问题:每次按下“撤消”按钮时,它都会逐行删除。我正在尝试将
我找到了将 X、Y 转换为半径和角度的方程式: x = r*Cos(Q) y = r*Sin(Q) r= sqrt(x*x + y*y) Q = tan^-1(y/x) 我的问题是我不记得 Objec
我正在尝试编写一个 if 语句,表示如果 block1 的位置超过某个点,则这种情况会发生在 block3 上。但是,当我尝试使用 >= 进行比较时,出现错误:“无法使用列表类型的参数调用 >= (@
我有一个带有 CGPoint 的 NSMutableArray。当我尝试将对象添加到我的 CGPoint 变量时,我看到了这个错误: Assigning to 'CGPoint' (aka 'stru
我遇到了快速构建错误。 func pathRefFromText() -> CGPathRef { let attributed : NSAttributedString = self
我有这个属性: @property (nonatomic) NSArray *vertices; 其中顶点的类型为CGPoint。 我知道 swift 有一些方便的语言功能,例如 NS_SWIFT_N
你好,对于基于导航的应用程序,我需要从 MKMapView 的坐标或 MKMapPoint 获取 CGPoint。我想在这些点之间画一条线,而不是折线。 我对 MKPolyLine 和其他自定义折线了
我正在使用 Firebase,并尝试将 [CGPoint] 数据库用于实时游戏。我尝试将结构类型更改为 [NSValue] 因为至少它符合 AnyObject (请参阅下面的代码),但现在我收到运行时
有没有简单的方法来做到这一点。 我有一个 CGPoint pointA (10, 10) 和另一个 CGPoint pointB (15, 8)。我需要得到一个 CGPoint,它与连接 A 和 B
如何获取tableView中选定的sectionIndexTitle的点(CGPoint)?我没有找到任何方法来实现这一点。 - (NSInteger)tableView:(UITableView *
我的类的界面部分有 CGPoint @interface MyClass () { CGPoint point; } 在代码中我尝试为其设置值 point = CGPointMake(1, 3
我有一个 CGPoints 数组,我想找到那些构建形状的点。请看附图: 红色圆圈只是标记我的点数。 如何找到带问号的区域? 谢谢。 最佳答案 您必须从第一条线段开始并检查是否有交点。显然,如果前两条线
我正在用下面的线创建圆弧 func drawSomething(_ context: CGContext, rect: CGRect) { context.saveGState() l
我是一名优秀的程序员,十分优秀!