我有一个结构位置,如下所示:
typedef struct Position { int x, y; } Position;
我如何在NSObject performSelector:withObject:afterDelay:
中传递它?像这样:
Position pos;
pos.x = pos.y = 1;
[self performSelector:@selector(foo:)
withObject:pos // ERROR
afterDelay:5.0f];
编辑:更改代码以修复拼写错误
答案 0 :(得分:9)
嗯..使用CGPoint之类的东西
[self performSelector:@selector(foo:)
withObject:[NSValue valueWithCGPoint:CGPointMake(pos.x, pos.y)]
afterDelay:5.0f];
再次阅读
NSValue v;
CGPoint point = [v CGPointValue];
或完全离开Position类,CGPoint也做同样的
答案 1 :(得分:3)
您可以使用NSValue
类包装自定义类型。错误是您没有提供对该方法的对象引用。
尝试使用NSValue
的{{1}}类方法。另一方面,您可以使用+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
检索值。
答案 2 :(得分:0)
preformSelector:withObject:
仅接受对象作为参数,因此您必须实现foo:
方法来接受对象。有两种方法可以将结构作为对象传递:
答案 3 :(得分:0)
完整答案,基于user756245(它没有告诉你如何使用它,没有很多帮助)。此外,Apple建议您使用稍微不同的方法,IIRC:
typedef myStruct { int a; } myStruct;
myStruct aLocalPointer = ... assign to it
[self performSelector:@selector(myOtherMethod:) withObject:[NSValue value:&aLocalPointer withObjCType:@encode(myStruct)] afterDelay:0.25];
答案 4 :(得分:0)
这很可能会造成麻烦,但您可以通过以这种方式将CGPoint
作为id
进行桥接:
withObject:(__bridge id)((void *)(&point))
如果point
超出范围并且您的选择器尝试读取它,这将导致崩溃。