最近在學習Server,再重溫Java 代碼,對比OC後,有着諸多的感觸,其中最深的是:Java中的反射使用是如此的頻繁和巧妙,對比OC,咱們知道OC中也有反射的。 OC下的反射的使用 在NSObjcRuntime類中體現,咱們知道OC語言是動態的,使用起來比較靈巧。java
NSString和SEL轉換 FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector); FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); NSString和NSClass轉換 FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass); FOUNDATION_EXPORT Class _Nullable NSClassFromString(NSString *aClassName); NSString和Protocol轉換 FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0); FOUNDATION_EXPORT Protocol * _Nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
類的實例化,方法,還有協議均可以用反射的方法實現,就目前我所使用過的代碼,印象最深的是,類的實例化使用,大多數app使用過這個場景: app推送了一條消息:須要實現跳轉到某個界面,執行一些操做。對於這個場景咱們須要在推送的消息內容中帶上什麼? 通常的app實現都會是經過字典。 我作的App是IM居多,下面說一下靠推送實現快速給好友發消息,即跳轉到TalkViewController界面編程
{ "class" : "TalkViewController", "method" : "sendMessage", "property" : { "friendId":18768177600, "msgType":2, "sessionType」:1 ... } };
class: 操做的類session
method:類須要實現的方法架構
property:附加的必要參數app
OC動態語言比java多了一個重要功能,能夠動態的在類中注入實現類和方法,利用了runtime性能
//注入類 // Default case. Create dynamic subclass. const char *subclassName = [className stringByAppendingString:AspectsSubclassSuffix].UTF8String; Class subclass = objc_getClass(subclassName); if (subclass == nil) { subclass = objc_allocateClassPair(baseClass, subclassName, 0); ... } //注入方法 class_addMethod(class, selector, method_getImplementation(method), method_getTypeEncoding(method));
反射的優勢:鬆耦合,能夠對象之間的依賴,實現不少原先比較麻煩的場景。學習
反射的缺點:性能略微低,經過字符串匹配內存中的實現,效率沒有直接引用高。 代碼可讀性低,對象之間的一些邏輯不能直觀體現。code
總結:反射是編程中的一個重要特色,在實際開發過程當中須要咱們合理運用,能提升代碼的質量,尤爲是在架構的過程當中。對象