2009-12-20 124 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