Взгляните на документацию NSObject
. В этом случае:
[parent performSelector:sel withObject:[NSNumber numberWithInt:i]];
(обратите внимание, этот метод фактически перечислены в документации NSObject
protocol). Поскольку -[NSObject performSelector:withObject:]
требует объект аргумента, вам придется написать обертку в классе родителей, как
-(void)myMethodForNumber:(NSNumber*)number {
[self myMethod:[number intValue]];
}
для распаковывать на NSNumber
.
Если вы действительно хотите вызвать метод, который принимает аргументы не-объект непосредственно (например, вы не имеете контроля источника вызываемого абонента и не хотите, чтобы добавить категорию), вы можете использовать NSInvocation
:
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[parent methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:parent];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
на стороне записки, ваш метод выглядит init
метод, но не следует правильный шаблон инициализатора для Objective-C. Вам нужно вызвать инициализатор суперклассов, и вам нужно проверить результат nil
этого вызова, и вы должны вернуть себя из метода инициализатора. Во всех случаях, ваши методы инициализатора Objective-C должен выглядеть следующим образом:
-(id)myInitMethod {
self = [super init];
if(self != nil) {
//perform initialization of self
}
return self;
}
Ваш метод (если это метод инициализации) будет выглядеть так:
-(id) init: (SEL)sel owner:(NSObject*) parent
{
self = [super init];
if(self != nil) {
int i = 10;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[parent methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:parent];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
}
return self;
}
Чтобы быть более Objective-C стилистически, Я бы переименовал инициализатор -(id)initWithSelector:owner:
.
спасибо, это идет выше и выше. Я догадался, что мне может понадобиться использовать NSInvocation, но не уверен. Отличный ответ. – madmik3
В стороне, даже если у вас нет контроля над вызываемым пользователем, вы все равно можете написать метод обертки, используя категорию этого класса, чтобы удалить объект в примитивный тип. –
Хорошая точка, ред. –