我知道我可以使用類來擴展一個類(例如框架類),但是否有可能讓您無法控制源代碼的類實現您的自定義協議之一?我不僅希望在發送給實例時對某些消息作出響應,而且理想情況下還希望在查詢協議時,該類的對象在運行時類型檢查時返回true。是否可以在Objective-C中動態實現協議?
3
A
回答
8
可以定義符合協議的範疇,所以你會做這樣的事情:
@interface UIWebView (MyGreatExtensions) <UITableViewDelegate>
@end
@implementation UIWebView (MyGreatExtensions)
- (CGFloat)tableView: (UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath {
return 42.0;
}
// ...
@end
小的邊緣情況下,要考慮的是,如果別人試圖做同樣的事情(例如第三方框架也通過一個類別添加協議),那麼你不能保證你的版本將被使用(當然也不能)。
關於此方法的更多信息from Mark Dalrymple。
1
我認爲這是可能的。通過覆蓋NSObject的forwardInvocation:方法,您可以輕鬆地在Objective-C中創建動態代理(這是NSUndoManager的功效),攔截協議實現者將響應的所有未識別消息。我從來沒有這樣做過,所以可能會有更優雅的方式來做到這一點。
此外,欺騙運行時檢查到同意你的對象確實實現了協議,你可以重寫NSObject中的類方法conformsToProtocol:像這樣:
+ (BOOL)conformsToProtocol:(Protocol *)aProtocol {
if (aProtocol == @protocol(MyDynamicallyImplementedProtocol))
return YES;
return [super conformsToProtocol:aProtocol];
}
有可能是你需要覆蓋更多的方法,一個例子是NSObject的instancesRespondToSelector:和resolve *:方法。檢查NSObject class reference以瞭解更多信息。
相關問題
- 1. Ruby是否具有Metaobject協議?如果不是,是否可以實現?
- 2. 如何檢查協議是否實現?
- 3. 是否可以繼承UiApplicationDelegate協議?
- 4. 協議是否可能具有靜態工廠方法的默認實現?
- 5. 是否需要在郵件服務器中實現POP3協議?
- 6. 「功能」可以在Elixir中實現協議嗎?
- 7. 一個類別可以在Objective C中實現協議嗎?
- 8. 實現NSCoding協議
- 9. 協議實現中的IBOutlet
- 10. 是否可以在ListView中實現ItemTemplate?
- 11. 是否可以在C#中實現mixin?
- 12. Linux協議中的http協議實現在哪裏
- 13. 檢查移動Safari是否可以處理特定的協議
- 14. 是否可以自動生成協議存根
- 15. 是基於現有協議的協議還是協議?
- 16. 在Java中實現3270協議
- 17. 在Java中實現OAuth協議
- 18. 在Veins中實現DSR協議Omnet ++
- 19. 是否有可能在類協議上創建willSet的默認實現
- 20. 是否可以在Android應用程序中實現Flex狀態
- 21. 是否可以通過簡單的方式實現動態ConfigurationSection?
- 22. 是否可以僅使用LISP基元來實現協程?
- 23. 協議Ecto.Queryable未實現
- 24. 如何實現協議
- 25. Jquery的Bayaux協議實現
- 26. CSAFE協議的實現
- 27. 無法實現協議
- 28. RFB協議的實現
- 29. RTSP協議棧實現
- 30. 網絡協議的實現
你爲什麼不繼承它並添加該協議? – kuba 2012-04-27 08:28:03
@kuba,因爲我想將它添加到由框架提供的現有實例中,而不僅僅是我實例化自己的實例。 – SoftMemes 2012-04-27 08:35:24