2009-12-18 62 views
0

ok ..想想objectA .. objectA在其協議中定義了可選屬性。代表可能會或可能不會實現這些,但如果您決定實施這些,則必須提供有效的回報。方法的條件實現

現在如果我有objectA.delegate設置爲對象B,但對象是需要實現他們都在編譯時間,並在運行時將決定哪些可能支持或不支持。 將它們全部作爲存根實現的問題意味着objectA將簡單地使用'respondsToSelector'來查看委託是否嘗試使用可選屬性,如果存在,它會認爲它們是有效的並使用它們。

由於對象B(代表)具有有條件地決定實施哪些,唯一的解決方案,我可以看到的是用「class_addMethod」。

我希望有可能是一個更優雅,更可能是最佳的解決方案,但不能肯定,因爲它可能是什麼。

回答

0

是的,使用NSObject的+(BOOL)resolveInstanceMethod:(SEL)aSEL結合class_AddMethod並根據您想要的任何標準連接您想要的實現。不知道這是你正在尋找或沒有。希望能幫助到你。

1

任何時候你認爲你需要使用class_addMethod()來實現的東西,你幾乎總是做錯了。

從你describe--這是相當vague--一個簡單的解決辦法是創造的東西,既可以充當委託,並可以有條件地轉發方法,如需要。

現在,你說,如果委託確實實現的方法就必須返回一個有效的值。如果是這樣的話,class_addMethod()不是真的有幫助。實現委託的大多數類將在委託實現該方法時檢查一次,然後會假設它永遠不會執行,除非委託更改。你可以進入經常更換代表的業務,但往下走的路是瘋狂。

更好的答案可能是提出一個問題; 你想做什麼?

+0

我同意修改類來實現我選擇的代表並不是很優雅。這個類是單一的分配,生活的應用程序的生活,所以修改類是安全的。並不是所有的代表都接受一個零值,或者暴露出他們會默認的東西。基本上它是一個殺人的所有,並提出問題的方法。我承擔責任以用戶生成的值對所有人做出響應,但需要一種在運行時安全地選擇和選擇的方法。 我會說迄今addmethod是唯一的方法,將實現我想要做的。 – drunknbass 2009-12-19 04:48:53