NSProxy的簡單使用

2021-09-24 08:31:55 字數 2208 閱讀 6555

- (void)forwardinvocation:(nsinvocation *)aninvocation;

- (nsmethodsignature *)methodsignatureforselector:(sel)sel;

複製**

這兩個方法來實現將訊息**給真正的物件。我們知道oc不支援多繼承,通過nsproxy,就可以模擬實現多繼承。那麼現在,nsproxy怎麼用呢?

假設現在有這樣乙個需求: 我們已經將專案中的網路介面進行了模組化,將不同模組下的介面放在了不同的檔案中。當我們想呼叫不同模組下的介面時,想要通過乙個統一的對映來呼叫,現在我們來寫這個對映。 首先,我們來建立兩個介面模組。 商品模組:

@protocol productserviceprotocel - (void)getproductinfo:(nsstring *)productskn;

@end

@inte***ce productservice : nsobject

@end

複製**

以及訂單模組:

@protocol orderserviceprotocel - (void)submitorder:(nsstring *)prodcutname;

@end

@inte***ce orderservice : nsobject

@end

複製**

######注意:這裡的介面宣告要寫在protocol中,然後讓我們的proxy遵循這兩個協議,用來騙過編譯器。 然後我們實現這兩個介面模組:

@implementation productservice

- (void)getproductinfo:(nsstring *)productskn

@end

複製**

@implementation orderservice

- (void)submitorder:(nsstring *)prodcutname

@end

複製**

現在我們來寫我們的對映。

#import 

#import "productservice.h"

#import "orderservice.h"

@inte***ce serviceproxy : nsproxy + (serviceproxy *)shareproxy;

@end

複製**

nsproxy是乙個抽象類,系統不提供init方法,所以需要我們自己實現。

#import "serviceproxy.h"

#import

@implementation serviceproxy

#pragma class method

+ (serviceproxy *)shareproxy

#pragma init

- (serviceproxy *)init

複製**

在init方法中,初始化成員變數已經將各界面模組中的方法以及物件對映在乙個字典中。

#pragma private

- (void)_registermethodswithtarget:(id)target

free(methodlist);

}複製**

接下來就可以重寫系統提供的兩個方法,根據方法名從我們的對映字典中找到對應的target,然後執行。

#pragma override

- (void)forwardinvocation:(nsinvocation *)invocation else

}- (nsmethodsignature *)methodsignatureforselector:(sel)sel else

}複製**

現在服務對映就寫完了,在控制器中來調動介面:

serviceproxy *proxy = [serviceproxy shareproxy];

[proxy getproductinfo:@"123456"];

[proxy submitorder:@"程式設計師標配的橫條紋t"];

複製**

最終的執行結果:demo

vcbuild的簡單使用

vcbuild 命令列 更新 2007 年 11 月 vcbuild 工具使用以下命令列語法來生成 visual c 專案和解決方案。複製 vcbuild options project solution config all 標誌 options生成選項。有關更多資訊,請參見 vcbuild 選項...

QList的簡單使用

qlistlist list 1 2 3 4 5 6 7 8 qlist的插入 voidinsert int i,const t value 在qlist其中某個位置插入value,假如沒 宣告i i 預設size 及在最後插入value iteratorinsert iterator before...

QTreeWidget的簡單使用

qtreewidget是一種樹形的部件,它以樹的形式顯示各個項,它的每個項使用qtreewidgetitem來表示。qtreewidgetitem的值的表示都是用qstringlist來表示的。簡單的說明一下 for int i 0 i 3 i for int i 0 i 3 i treewidge...