前兩篇文章主要是對這篇文章的內容進行了乙個鋪墊,這裡就一起來看下ctmediator
的實現原理 ,ctmediator
是乙個單例,主要是基於mediator
模式和target-action
模式,中間採用了runtime
來完成呼叫
- (id)performtarget:(nsstring *)targetname action:(nsstring *)actionnameparams:(nsdictionary *)params shouldcachetarget:(bool)shouldcachetarget;
複製**
實現分析:
// 從 params 字典中 獲取 swiftmodulename
nsstring *swiftmodulename = params[kctmediatorparamskeyswifttargetmodulename];
// generate target
nsstring *targetclassstring = nil;
if (swiftmodulename.length > 0) else
// 根據 targetclassstring 從 cachedtarget (快取的target)獲取 target
nsobject *target = self.cachedtarget[targetclassstring];
if (target == nil)
// generate action
nsstring *actionstring = [nsstring stringwithformat:@"action_%@:", actionname];
sel action = nsselectorfromstring(actionstring);
if (target == nil)
// 是否需要對 target 進行快取
if (shouldcachetarget)
// 判斷target物件是否響應action,避免crash
if ([target respondstoselector:action]) else else
}複製**
處理有響應請求的地方會呼叫- (id)safeperformaction:(sel)action target:(nsobject *)target params:(nsdictionary *)params
方法
// nsmethodsignature 記錄著某個方法的返回值型別資訊以及引數型別資訊。用於**訊息接收者無法響應的訊息
nsmethodsignature* methodsig = [target methodsignatureforselector:action];
if(methodsig == nil)
// 獲取返回型別
const char* rettype = [methodsig methodreturntype];
// 判斷返回值 型別
if (strcmp(rettype, @encode(void)) == 0)
if (strcmp(rettype, @encode(nsinteger)) == 0)
if (strcmp(rettype, @encode(bool)) == 0)
if (strcmp(rettype, @encode(cgfloat)) == 0)
if (strcmp(rettype, @encode(nsuinteger)) == 0)
// 利用runtime 向target物件傳遞訊息,執行 target 中 action 的方法,傳遞引數 params
return [target performselector:action withobject:params];
複製**
總結:ctmediator
根據獲得的target和action資訊,通過objective-c的runtime轉化生成target例項以及對應的action選擇器,然後最終呼叫到目標業務提供的邏輯,完成需求。 CGI原理解析系列之三
模擬了伺服器端 httpd 程序啟動 cgi的過程,完整展現了 get,post 方法支援 等待cgi子程序完全把資料讀取後寫入,實際情況應該是使用select 或者 epoll 監聽 usleep 1000 模擬接收 cgi 應答的資料 char buff 256 length read chil...
LCD原理解析
硬體體系 3個部分 lcd液晶 屏 lcd驅動晶元 lcd控制器 整合在arm晶元內部 控制器 通過驅動晶元 控制液晶屏 液晶屏種類 stn gf tft tft 在嵌入式中較為常用 lcd控制器結構與模組 由17個可程式設計的暫存器組和一塊 256 16的調色盤內 存組成,通過這些暫存器,可以配置...
session原理解析
首先session跟cookies都是會會話進行跟蹤,session通過在伺服器端記錄資訊來記錄,cookies通過在客戶端記錄資訊來記錄。在此只對session進行分析 session是記錄在伺服器記憶體中的,每當乙個使用者通過瀏覽器第一次進行訪問時進行建立 需要注意只有訪問jsp,servlet...