将struct传递给performSelector:withObject:afterDelay:

时间:2011-07-10 16:25:42

标签: objective-c struct

我有一个结构位置,如下所示:

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];

编辑:更改代码以修复拼写错误

5 个答案:

答案 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:方法来接受对象。有两种方法可以将结构作为对象传递:

  • 创建类似结构的对象或
  • 将其包装到NSValue中并在方法中解包。

答案 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超出范围并且您的选择器尝试读取它,这将导致崩溃。