как создать "массив селекторов"


Я использую iPhone SDK (3.0) и пытаюсь создать массив селекторов для вызова различных методов в пределах одного класса.

очевидно, что я делаю что-то неправильно (я думаю, что @selector не считается классом, и поэтому заполнение их в NSArray не работает).

Я пробовал это, но это, очевидно, неправильно.

есть ли простой способ получить массив селекторов, как это? Или есть лучший способ перебрать коллекция методов?

selectors = [NSArray arrayWithObjects:
                          @selector(method1),
                          @selector(method2),
                          @selector(method3),
                          @selector(method4),
                          @selector(method5),
                          @selector(method6),
                          @selector(method7), nil];

for (int i = 0; i < [selectors count]; i++) {
    if ([self performSelector:[selectors objectAtIndex:i]]) // do stuff;
}
5 80

5 ответов:

не могли бы вы хранить строки и использовать NSSelectorFromString?

С docs

NSSelectorFromString

возвращает селектор с заданным именем.

SEL NSSelectorFromString (
   NSString *aSelectorName
);

Это создает объект из селектора:

[NSValue valueWithPointer:@selector(x)]

почему бы просто не использовать простой массив c?

static const SEL selectors[] = {@selector(method1),
                                ....
                                @selector(method7)};

...

for (int i = 0; i < sizeof(selectors)/sizeof(selectors[0]); i++) {
  [self performSelector:selectors[i]];
  // ....
}

вы также можете создать массив NSInvocationы. Это удобно, если вам нужен аргумент, чтобы пойти с вашей селектор.

NSMethodSignature *sig = [[yourTarget class] instanceMethodSignatureForSelector:yourSEL];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setTarget:yourTarget];
[inv setSelector:yourSEL];
[inv setArgument:&yourObject atIndex:2]; // Address of your object

Если список статичен, я бы пошел с решением KennyTM, но если вам нужен динамический массив или набор, другой вариант, помимо хранения строки селектора, заключается в создании объекта с SEL свойство или Ивар, и сохраните это.

@interface SelectorObject : NSObject
@property (assign, readonly, nonatomic) SEL selector;
- (id)initWithSelector:(SEL)selector;
@end

@implementation SelectorObject
- (id)initWithSelector:(SEL)selector {
  self = [super init];
  if (self) {
    _selector = selector;
  }
  return self;
}
@end

затем вы можете добавить perform метод к классу, а также реализовать вызов метода там.