Ознакомьтесь с документацией NSObject
. В этом случае:
[parent performSelector:sel withObject:[NSNumber numberWithInt:i]];
(обратите внимание, этот метод фактически указан в документации NSObject
). Поскольку -[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
результат этого вызова, и вы должны вернуть self из метода инициализатора. Во всех случаях ваши методы инициализатора Objective C должны выглядеть следующим образом:
-(id)myInitMethod {
self = [super init];
if(self != nil) {
//perform initialization of self
}
return self;
}
Ваш метод (если это метод init) будет выглядеть так:
-(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:
.