как создать "массив селекторов"
Я использую 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 ответов:
не могли бы вы хранить строки и использовать NSSelectorFromString?
С docs
NSSelectorFromString
возвращает селектор с заданным именем.
SEL NSSelectorFromString ( NSString *aSelectorName );
почему бы просто не использовать простой массив 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
метод к классу, а также реализовать вызов метода там.