Передайте struct для executeSelector: withObject: afterDelay: - PullRequest
5 голосов
/ 10 июля 2011

У меня есть структура Позиция, например:

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 ]

9 голосов
/ 10 июля 2011

Хм .. используйте CGPoint и что-то вроде

[self performSelector:@selector(foo:) 
           withObject:[NSValue valueWithCGPoint:CGPointMake(pos.x, pos.y)] 
           afterDelay:5.0f];

И прочитайте его снова как

NSValue v;
CGPoint point = [v CGPointValue];

или полностью исключите класс Position, CGPoint сделает то же самое

3 голосов
/ 10 июля 2011

Вы можете обернуть свой пользовательский тип, используя класс NSValue. Ошибка в том, что вы не указали ссылку на объект для метода.

Попробуйте использовать NSValue метод класса +(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;. С другой стороны вы можете получить значение, используя -(void)getValue:(void *)buffer;.

0 голосов
/ 21 февраля 2017

Скорее всего, это вызывает проблемы, но вы можете передать CGPoint как id, связав его следующим образом:

withObject:(__bridge id)((void *)(&point))

Это приведет к сбоюесли point выходит из области видимости, и ваш селектор пытается прочитать его.

0 голосов
/ 18 сентября 2012

Полный ответ, основанный на пользователях 756245 (который не говорит вам, как его использовать, не очень помогает). Кроме того, 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];
0 голосов
/ 10 июля 2011

preformSelector:withObject: принимает только объекты в качестве параметров, поэтому вам придется реализовать свой метод foo: для принятия объекта.Есть два способа передать структуру как объект:

  • создать объект, похожий на структуру, или
  • обернуть его в NSValue и развернуть в методе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...