Есть ли объект обертки для SEL? - PullRequest
4 голосов
/ 30 мая 2009

Я хочу добавить селекторы в NSMutableArray. Но поскольку они непрозрачные типы и не содержат объектов, это не сработает, верно? Есть ли объект-обертка, который я могу использовать? Или я должен создать свой собственный?

Ответы [ 3 ]

9 голосов
/ 30 мая 2009

Вы можете заключить его в экземпляр NSValue следующим образом:

SEL mySelector = @selector(performSomething:);
NSValue *value = [NSValue value:&mySelector withObjCType:@encode(SEL)];

, а затем добавьте значение к вашему экземпляру NSMutableArray.

5 голосов
/ 30 мая 2009

Вы можете сохранить имя NSString селектора в массиве и использовать

SEL mySelector = NSSelectorFromString([selectorArray objectAtIndex:0]);

для генерации селектора из сохраненной строки.

Кроме того, вы можете упаковать селектор как NSInvocation, используя что-то вроде

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:mySelector]];

[invocation setTarget:self];
[invocation setSelector:mySelector];
[invocation setArgument:&arg atIndex:2];
[invocation retainArguments];

Этот объект NSInvocation затем может быть сохранен в массиве и вызван позже.

2 голосов
/ 27 декабря 2011

NSValue valueWithPointer / pointerValue работает одинаково хорошо.

вам просто нужно знать, что вы не можете сериализовать массив (т.е. записать его в файл), если вы хотите это сделать, используйте подход NSStringFromSelector.

это все допустимые способы помещения селектора в объект NSValue:

    id selWrapper1 = [NSValue valueWithPointer:_cmd];
    id selWrapper2 = [NSValue valueWithPointer:@selector(viewDidLoad)];
    id selWrapper3 = [NSValue valueWithPointer:@selector(setObject:forKey:)];
    NSString *myProperty = @"frame";
    NSString *propertySetter = [NSString stringWithFormat:@"set%@%@:",
                                [[myProperty substringToIndex:1]uppercaseString],
                                [myProperty substringFromIndex:1]];

    id selWrapper4 = [NSValue valueWithPointer:NSSelectorFromString(propertySetter)];

    NSArray *array = [NSArray arrayWithObjects:
                      selWrapper1,
                      selWrapper2,
                      selWrapper3,
                      selWrapper4, nil];

    SEL theCmd1 = [[array objectAtIndex:0] pointerValue];
    SEL theCmd2 = [[array objectAtIndex:1] pointerValue];
    SEL theCmd3 = [[array objectAtIndex:2] pointerValue];
    SEL theCmd4 = [[array objectAtIndex:3] pointerValue];
...