2009-12-20 117 views
1

我一定误解了一些东西。我只是想使用performSelector:来调用我自己的方法之一。这里我在@interface中声明方法:选择问题

-(void)forceReload; 

仅供参考,所有这些代码仅在一种类型上定义。这里是方法的实现和调用方法:

-(void)forceReload { 
    // code here... 
} 

-(void)entryActivityEditViewControllerDidFinish { 

    // etc... 

    DebugLog(@"self=%@", self); 
    DebugLog(@"responds to selector=%@", [self respondsToSelector:@selector(forceReload:)] ? @"true" : @"false"); 
    [self forceReload]; // Works fine 
    [self performSelector:@selector(forceReload:)]; // unrecognized selector 
} 

什么混淆的是,我可以直接发送消息给对象,但与performSelector使用时失败:。前者的成功是否意味着后者的成功?

为了使它圆润,下面是一些调试过程,显示我的目标对象(self)是我认为的类型,并且发送给适当的对象。我还包括一个对respondsToSelector的调用:并发现我的对象不响应forceReload:这让我更加困惑。为什么会这样?

0x1006030/-[EntryActivityTableViewController entryActivityEditViewControllerDidFinish] (EntryActivityTableViewController.m:236): self=<EntryActivityTableViewController: 0x1259160> 
0x1006030/-[EntryActivityTableViewController entryActivityEditViewControllerDidFinish] (EntryActivityTableViewController.m:237): responds to selector=false 
2009-12-20 10:22:44.999 Workouts[407:207] *** -[EntryActivityTableViewController forceReload:]: unrecognized selector sent to instance 0x1259160 
2009-12-20 10:22:45.017 Workouts[407:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[EntryActivityTableViewController forceReload:]: unrecognized selector sent to instance 0x1259160' 

请告诉我我的理解错在哪里。 :-)

回答

3

你的方法不带任何参数,但你的@selector()调用请求一个带有一个参数的选择器。你想要的是这样的:

[self performSelector:@selector(forceReload)]; // unrecognized selector 
+1

heh,由语法错误取下。谢谢Ben! – 2009-12-21 12:22:49