我可以传递一个函数名作为参数吗?

时间:2011-12-26 22:45:34

标签: iphone objective-c cocos2d-iphone

我想让这个类通过向它传递不同的名称来动态地执行函数。那可能吗 ?或者更确切地说:它怎么可能?

-(id)initWithMethod:(NSString*)method{

    if ((self = [super init])){


        [self method];

    }
    return self;
}

-(void) lowHealth {
    CCSprite *blackScreen = [CCSprite spriteWithFile:@"blackscreen.png"];
    blackScreen.anchorPoint = ccp(0,0);
    [self addChild:blackScreen];

    id fadeIn = [CCFadeIn actionWithDuration:1];
    id fadeOut = [CCFadeOut actionWithDuration:1];
    id fadeInAndOut = [CCRepeatForever actionWithAction:[CCSequence actions:fadeIn, fadeOut, nil]];

    [blackScreen runAction:fadeInAndOut];
}

2 个答案:

答案 0 :(得分:7)

您应该使用performSelector并使用NSStringNSSelectorFromString获取选择器:

[self performSelector:NSSelectorFromString(method)];

而不是[self method];

答案 1 :(得分:1)

标准方法是使用Matteo答案中提到的Selectors

您还可以查看Objective-C Blocks。它们在CocoaTouch API中变得非常普遍,你可以用它们做一些非常灵活的事情。由此产生的课程架构通常更容易理解IMO。

例如来自UIView的这个方法

+ (void)animateWithDuration:(NSTimeInterval)duration 
                 animations:(void (^)(void))animations 
                 completion:(void (^)(BOOL finished))completion

采用两个块,一个用于运行实际动画的代码,另一个用于动画完成后的代码。您可以使用块变量或通过内联编写代码来调用它:

...animations:^{
       // animation code
   } 
   completion:^(BOOL finished) {
       // completion code
   }

接收方法(在这种情况下是animateWithDuration:...)只会在某个时刻调用这些块:

animations();