欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ios使用NSProxy實(shí)現(xiàn)消息轉(zhuǎn)發(fā)

 更新時(shí)間:2022年07月04日 10:15:00   作者:任淏  
本文主要介紹了ios使用NSProxy實(shí)現(xiàn)消息轉(zhuǎn)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

簡(jiǎn)介

? 在 iOS 應(yīng)用開發(fā)中,自定義一個(gè)類一般需要繼承自 NSObject 類或者 NSObject 子類,但是,NSProxy 類不是繼承自 NSObject 類或者 NSObject 子類,而是一個(gè)實(shí)現(xiàn)了 NSObject 協(xié)議的抽象基類。

/*?? ?NSProxy.h
?? ?Copyright (c) 1994-2019, Apple Inc. All rights reserved.
*/

#import <Foundation/NSObject.h>

@class NSMethodSignature, NSInvocation;

NS_ASSUME_NONNULL_BEGIN

NS_ROOT_CLASS
@interface NSProxy <NSObject> {
? ? __ptrauth_objc_isa_pointer Class?? ?isa;
}

+ (id)alloc;
+ (id)allocWithZone:(nullable NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
+ (Class)class;

- (void)forwardInvocation:(NSInvocation *)invocation;
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel NS_SWIFT_UNAVAILABLE("NSInvocation and related APIs not available");
- (void)dealloc;
- (void)finalize;
@property (readonly, copy) NSString *description;
@property (readonly, copy) NSString *debugDescription;
+ (BOOL)respondsToSelector:(SEL)aSelector;

- (BOOL)allowsWeakReference API_UNAVAILABLE(macos, ios, watchos, tvos);
- (BOOL)retainWeakReference API_UNAVAILABLE(macos, ios, watchos, tvos);

// - (id)forwardingTargetForSelector:(SEL)aSelector;

@end

NS_ASSUME_NONNULL_END

NSProxy 的作用就是作為一個(gè)委托代理對(duì)象,將消息轉(zhuǎn)發(fā)給一個(gè)真實(shí)的對(duì)象或者自己加載的對(duì)象。

為了進(jìn)一步了解 NSProxy 類的作用,我們來(lái)實(shí)現(xiàn)一個(gè)同事調(diào)用 NSMutableString 和 NSMutableArray 兩個(gè)類中的方法的委托類,模擬多繼承。

首先創(chuàng)建 TargetProxy 類,讓他繼承 NSProxy。并實(shí)現(xiàn)初始化方法。

@interface TargetProxy : NSProxy


/// 初始化方法,保存兩個(gè)真實(shí)對(duì)象
/// @param object1 第一個(gè)真實(shí)對(duì)象
/// @param object2 第二個(gè)真實(shí)對(duì)象
- (instancetype)initWithObject1:(id)object1 object2:(id)object2;

@end
@implementation TargetProxy {

? ? // 保存需要將消息轉(zhuǎn)發(fā)到的第一個(gè)真實(shí)對(duì)象
? ? // 第一個(gè)真實(shí)對(duì)象的方法調(diào)用優(yōu)先級(jí)會(huì)比第二個(gè)真實(shí)對(duì)象的方法調(diào)用優(yōu)先級(jí)高
? ? id _realObject1;
? ? // 保存需要將消息轉(zhuǎn)發(fā)到的第二個(gè)真實(shí)對(duì)象
? ? id _realObject2;
}

- (instancetype)initWithObject1:(id)object1 object2:(id)object2 {
? ? _realObject1 = object1;
? ? _realObject2 = object2;
? ??
? ? return self;
}

然后在 TargetProxy.m 文件中,重寫 - methodSignatureForSelector: 獲取真實(shí)對(duì)象方法簽名,并重寫 - forwardInvocation: 方法,調(diào)用真實(shí)的對(duì)象方法。

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
? ? // 獲取 _realObject1 中 sel 的方法簽名
? ? NSMethodSignature *signature = [_realObject1 methodSignatureForSelector:sel];
? ? // 如果 _realObject1 中有該方法,那么返回該方法的簽名
? ? // 如果沒(méi)有,返回 _realObject1 方法簽名
? ? if (signature) {
? ? ? ? return signature;
? ? }
? ? // 獲取 _realObject1 中的 sel 的方法簽名
? ? signature = [_realObject2 methodSignatureForSelector:sel];
? ? return signature;
}

- (void)forwardInvocation:(NSInvocation *)invocation {
? ? // 獲取擁有該方法的真實(shí)對(duì)象
? ? id target = [_realObject1 methodSignatureForSelector:[invocation selector]] ? _realObject1 : _realObject2;

? ? // 執(zhí)行方法
? ? [invocation invokeWithTarget:target];
}

最后,進(jìn)行 Demo 測(cè)試

- (void)testTargetProxy {
? ? NSMutableString *string = [NSMutableString string];
? ? NSMutableArray *array = [NSMutableArray array];
? ??
? ? id proxy = [[TargetProxy alloc] initWithObject1:string object2:array];
? ? [proxy appendString:@"This "];
? ? [proxy appendString:@"is "];
? ? [proxy addObject:string];
? ? [proxy appendString:@"a "];
? ? [proxy appendString:@"test!"];
? ??
? ? NSLog(@"The string is length is: %@", [proxy valueForKey:@"length"]);
? ? NSLog(@"count should be 1, it is %ld", [proxy count]);
? ??
? ? if ([[proxy objectAtIndex:0] isEqualToString:@"This is a test!"]) {
? ? ? ? NSLog(@"Appending successful.");
? ? } else {
? ? ? ? NSLog(@"Appending failed,, got: '%@'", proxy);
? ? }
}

運(yùn)行上面的代碼,輸入日志如下:

2022-04-02 11:30:35.957145+0800 Demo[19783:586710] SuccessFully create Delegere Proxy automatically.
2022-04-02 11:30:35.959722+0800 Demo[19783:586710] The string is length is: 15
2022-04-02 11:30:35.960175+0800 Demo[19783:586710] count should be 1, it is 1
2022-04-02 11:30:40.086227+0800 Demo[19783:586710] Appending successful.

? 以上說(shuō)明,我們使用 TargetProxy 類成功的實(shí)現(xiàn)了消息轉(zhuǎn)發(fā)。

? 當(dāng)然,在大部分情況下,使用 NSObject 類也可以實(shí)現(xiàn)消息轉(zhuǎn)發(fā),實(shí)現(xiàn)方式和 NSProxy 類似,但是大部分情況下使用 NSProxy 更加合適。因?yàn)椋?/p>

  • NSProxy 類實(shí)現(xiàn)了包括 NSObject 協(xié)議在內(nèi)基類所需的基礎(chǔ)方法
  • 通過(guò) NSObject 類實(shí)現(xiàn)的代理類不會(huì)自動(dòng)的轉(zhuǎn)發(fā) NSObject 協(xié)議中的方法
  • 通過(guò) NSObject 類實(shí)現(xiàn)的代理類不會(huì)自動(dòng)的轉(zhuǎn)發(fā) NSObject 類別中的方法

 到此這篇關(guān)于ios使用NSProxy實(shí)現(xiàn)消息轉(zhuǎn)發(fā)的文章就介紹到這了,更多相關(guān)ios NSProxy消息轉(zhuǎn)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法

    iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法,文章最后給出了完整的示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • IOS中的webView加載HTML

    IOS中的webView加載HTML

    在日常開發(fā)中,我們?yōu)榱诵蕰?huì)用到很多很多的WebView,比如在做某個(gè)明細(xì)頁(yè)面的時(shí)候我們返回給你的可能是一個(gè)html字符串,我們就需要將當(dāng)前字符串展示到webView上面,所以我們對(duì)HTML標(biāo)簽需要有一定的認(rèn)識(shí),下面我們來(lái)一起用html標(biāo)簽和JS寫一個(gè)打地鼠游戲
    2016-02-02
  • iOS實(shí)現(xiàn)手動(dòng)和自動(dòng)屏幕旋轉(zhuǎn)

    iOS實(shí)現(xiàn)手動(dòng)和自動(dòng)屏幕旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)手動(dòng)和自動(dòng)屏幕旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 關(guān)于ios配置微信config出現(xiàn)驗(yàn)簽失敗的問(wèn)題解決

    關(guān)于ios配置微信config出現(xiàn)驗(yàn)簽失敗的問(wèn)題解決

    這篇文章主要介紹了關(guān)于ios配置微信config出現(xiàn)驗(yàn)簽失敗的問(wèn)題解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • iOS如何獲取設(shè)備型號(hào)的最新方法總結(jié)

    iOS如何獲取設(shè)備型號(hào)的最新方法總結(jié)

    在開發(fā)中,我們經(jīng)常需要獲取設(shè)備的型號(hào)以進(jìn)行數(shù)據(jù)統(tǒng)計(jì)或者做不同的適配。這篇文章主要給大家介紹了關(guān)于iOS如何獲取設(shè)備型號(hào)的最新方法,需要的朋友可以參考下
    2018-11-11
  • iOS實(shí)現(xiàn)文本分頁(yè)的方法示例

    iOS實(shí)現(xiàn)文本分頁(yè)的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)文本分頁(yè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于iOS獲取屬性你真的了解嗎?

    關(guān)于iOS獲取屬性你真的了解嗎?

    這篇文章主要給大家介紹了關(guān)于iOS取屬性的相關(guān)資料,當(dāng)說(shuō)到取屬性,相信很多的iOS開發(fā)者們會(huì)說(shuō)出很多,但你就真的理解嗎?下面就來(lái)詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-12-12
  • iOS - UIButton(UIEdgeInsets)/設(shè)置button上的文字和圖片上下垂直居中對(duì)齊

    iOS - UIButton(UIEdgeInsets)/設(shè)置button上的文字和圖片上下垂直居中對(duì)齊

    這篇文章主要介紹了iOS - UIButton(UIEdgeInsets)/設(shè)置button上的文字和圖片上下垂直居中對(duì)齊的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • iOS開發(fā)-調(diào)用系統(tǒng)相機(jī)和相冊(cè)獲取照片示例

    iOS開發(fā)-調(diào)用系統(tǒng)相機(jī)和相冊(cè)獲取照片示例

    這篇文章主要介紹了iOS開發(fā)-調(diào)用系統(tǒng)相機(jī)和相冊(cè)獲取照片示例的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • IOS 開發(fā)之swift中手勢(shì)的實(shí)例詳解

    IOS 開發(fā)之swift中手勢(shì)的實(shí)例詳解

    這篇文章主要介紹了IOS 開發(fā)之swift中手勢(shì)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握IOS手勢(shì)的使用方法,需要的朋友可以參考下
    2017-09-09

最新評(píng)論