iphone – SEL performSelector和arguments

看起来应该有一个简单的方法来调用带有一些参数的选择器,当你有一个SEL对象。我似乎找不到正确的语法。

-(MyClass*) init: (SEL)sel owner:(NSObject*) parent
{
   int i =10;
   [parent performSelector:sel:i  ];
}
看看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结果,并且您必须从initializer方法返回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风格上,我会重命名initializer – (id)initWithSelector:owner:以及。

http://stackoverflow.com/questions/2716143/sel-performselector-and-arguments

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:iphone – SEL performSelector和arguments