executeSelector не будет передавать объект в селектор - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть NSSet-объект, который я хочу передать в performSelector -call:

NSSet *myNSSetObject = [self getSet];

if (myNSSetObject.count != 1)
    return;

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5];

Проблема в том, что Объект приходит пустым в myMethod.Поскольку executeSelector сохраняет переданный объект, я не понимаю, что происходит неправильно.

Мой метод определяется следующим образом

- (void)myMethod:(NSSet *)myNSSetParam {
   NSLog(@"Set count: %d", myNSSetParam.count);
   [do sth];
}

NSLog показывает: Set count: 0


Если заглянуть глубже в этот вопрос и уже предложенный подсчетом выше, объект NSSet фактически передается, но теряет свои записи.

Разве NSSet не сохраняет свои объекты?

Ответы [ 5 ]

1 голос
/ 07 декабря 2010

После возвращения из первого сообщения (или частично ниже фрагмента кода), случайно ли вы изменили NSSet, доставленный [self getSet]? Если впоследствии вы удалите объекты из набора, myMethod: больше не сможет получить к нему доступ.

1 голос
/ 06 декабря 2010

Действительно ли myMethod принимает аргумент? Важно отметить, что имена методов и селекторы в Objective C фактически включают двоеточия, которые присутствуют в объявлении; следовательно, такой метод:

 - (void)myMethod:(NSSet *)set;
На

должна указываться @selector(myMethod:), включая завершающий двоеточие.

0 голосов
/ 07 декабря 2010

Вы уверены, что getSet возвращает фактический NSSet, а не изменяемый подкласс, скрывающийся под NSSet "базовым указателем"?Если оно изменчиво, возможно, что набор будет изменен в течение 0,5 секундной задержки.Даже если performSelector:withObject:afterDelay: сохраняет набор, он не препятствует его изменению.

0 голосов
/ 06 декабря 2010

Вы имели в виду

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5]

Предположим, myMethod: это метод, который принимает объект?

0 голосов
/ 06 декабря 2010

Вам следует позвонить

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5];

вместо этого (обратите внимание на двоеточие после имени сообщения).

...