看看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:
以及。