2012-08-17 78 views

回答

3

如果fun预计没有参数,你可以这样做:如果希望一个对象参数

[target performSelector:fun]; 

,你可以这样做:

[target performSelector:fun withObject:someObject]; 

如果它期望两个对象参数,您可以这样做:

[target performSelector:fun withObject:someObject withObject:anotherObject]; 

如果需要三个以上的参数,或者如果它预期不是对象的参数,你必须使用objc_msgSend,由this answer解释。

+0

非常感谢。你知道如何获得这个乐趣作为obj例如self.targetFun = fun; – user1052163 2012-08-17 17:43:05

0
- (id) init:(NSString*)fun{ 

[target NSSelectorFromNSString(fun)]; 

} 

- (void) methodCaller{ 
     [[MyClass alloc] init:NSStringFromSelector(@selector(method1))]; 
} 
+0

非常感谢。你知道什么是(SEL)类型的乐趣,例如我不能这样做“id targetFun = fun”; – user1052163 2012-08-17 17:54:34

+0

选择器总是由计数器字符串表示。你能告诉场景,你可以在其中获得选择器的ID。好玩的是总是SEL类型选择,如果你想将它从1种方法传递作为一个对象以外,那么我们宁愿NSString的,因为苹果还与NSString的SEL的相互转换只提供了API。 – 2012-08-17 18:26:13

+0

非常感谢你真的工作。 – user1052163 2012-08-18 00:45:52

0

您可以使用三种mehods此:

  1. 使用performSelector:,如:[target performSelector:fun withObject:nil];
  2. 使用detachNewThreadSelector这样的:[NSThread detachNewThreadSelector:fun toTarget:target withObject:nil];,但它会在另一个线程上运行。
  3. 使用NSInvocation喜欢:

NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:fun];
[inv invokeWithTarget:target];

+0

非常感谢你如何加载这个乐趣到另一点例如[singleton single] .fun = fun;这样我可以移动这个有趣的OBJ到另一个类的函数 – user1052163 2012-08-17 17:59:42

+0

不能调用使用选择'.'或'[目的地选择]'这些方法。要么打电话给任何上述方法或其变体。如果你需要将选择器传递给另一个类,那么在那里创建一个'SEL'对象并将其传递给它。 – 2012-08-17 18:04:45

+0

使用可以像NSString一样获得乐趣。然后可以将其用作对象,但在这两种情况下,都需要将SEL(伊娃)转换为对象。 “”运算符用于调用属性的getter或setter而不起作用。 – 2012-08-17 18:28:12