mad*_*ik3 28 iphone objective-c selector
看起来应该有一种简单的方法来调用带有一些参数的选择器,只要你拥有一个SEL对象.我似乎找不到正确的语法.
-(MyClass*) init: (SEL)sel owner:(NSObject*) parent
{
int i =10;
[parent performSelector:sel:i ];
}
Run Code Online (Sandbox Code Playgroud)
Bar*_*ark 76
看一下NSObject文档.在这种情况下:
[parent performSelector:sel withObject:[NSNumber numberWithInt:i]];
Run Code Online (Sandbox Code Playgroud)
(注意此方法实际上列在NSObject协议文档中).由于-[NSObject performSelector:withObject:]需要一个object参数,你必须在父类的类中编写一个包装器
-(void)myMethodForNumber:(NSNumber*)number {
[self myMethod:[number intValue]];
}
Run Code Online (Sandbox Code Playgroud)
取消装箱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];
Run Code Online (Sandbox Code Playgroud)
另外,您的方法看起来像一个init方法,但不遵循Objective-C的正确初始化模式.您需要调用超类初始值设定项,并且需要测试nil该调用的结果,并且必须从初始化方法返回self.在所有情况下,Objective-C初始化方法应如下所示:
-(id)myInitMethod {
self = [super init];
if(self != nil) {
//perform initialization of self
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
您的方法(如果它是一个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;
}
Run Code Online (Sandbox Code Playgroud)
为了更具风格的Objective-C,我也会重命名初始化器-(id)initWithSelector:owner:.
yun*_*nas 12
Barry Wark说的很棒..我刚刚修改了懒惰程序员的讨论
-(void)myMethodWith:(int)number andBOOL:(BOOL) someBool andStr:(NSString *)str{
NSLog(@"%d %d %@",number,someBool,str);
}
-(void) testMethod{
SEL sel = @selector(myMethodWith:andBOOL:andStr:);
int i = 10;
BOOL bol = YES;
NSString *str = @"hey baby !";
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:self];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv setArgument:&bol atIndex:3];
[inv setArgument:&str atIndex:4];
[inv invoke];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39446 次 |
| 最近记录: |