iOS 中的反射

最近在學習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

總結:反射是編程中的一個重要特色,在實際開發過程當中須要咱們合理運用,能提升代碼的質量,尤爲是在架構的過程當中。對象

相關文章
相關標籤/搜索