2010-05-24 48 views
3

我想從類方法構建選擇器。傳遞類方法作爲選擇器問題

我做這樣說:

NavigationTreeActionHandler* handler=[NavigationTreeActionHandler self]; 
NavigationTreeNode* bombsNode=new NavigationTreeNode("Bombs","bigbomb.tif" 
    ,handler,@selector(BigBombButtonPressed:)); 

我需要傳遞給NavigationTreeNode目標和選擇的目標的方法。 我嘗試使用類對象的自我屬性來獲取目標(不知道htis是否是正確的方法)。然後我得到我想調用該類的類方法的選擇器。

一切編譯好的,但是當我用它失敗:

[[handler class] instanceMethodSignatureForSelector:selector];

我得到一個零,真的不知道爲什麼......可能有人幫助嗎?

+0

'[NavigationTreeActionHandler類]'是編寫'[NavigationTreeActionHandler self]'的首選方式,但它不應該有所作爲 – user102008 2011-07-22 23:27:32

回答

3

幾點建議:

  • [NavigationTreeActionHandler self]將正常工作,以獲取類對象,但我會宣佈handlerid類型,而不是NavigationTreeActionHandler*,因爲它不是一個實例的引用類型

  • [handler class]是多餘的; handler已經是類對象。

  • instanceMethodSignatureForSelector:只會返回零,如果handler不執行selector。驗證你的拼寫等等,然後嘗試拋出一個NSLog來驗證你正在收到什麼:

    NSLog(「handler =%@ sel =%@」,handler,NSStringFromSelector(selector));

但我不清楚你想要做什麼instanceMethodSignatureForSelector:擺在首位。如果你只是想調用類的方法,不會0123'做你想要的嗎?

1

很可能您使用的代碼假定調用方法class將獲得對象的類,並因此使用[[handler class] instanceMethodSignatureForSelector:selector]獲取對象handler上選擇器的方法簽名。雖然這適用於普通對象,但對類對象不起作用,因爲類對象上的class方法的含義不同,因爲類方法+class覆蓋實例方法-class+class只是返回它所調用的對象,而是它是(元類)的一個實例。

的解決方案是,你甚至都不需要獲取類所有的,因爲有你可以一個實例調用以獲取其方法簽名的方法:

[handler methodSignatureForSelector:selector] 

這是一個非常短更簡單的做法,也適用於類對象。