当前位置:首页 > CN2资讯 > 正文内容

iOS设计模式 - 代理iOS开发设计模式

1天前CN2资讯

iOS设计模式 - 代理

原理图

说明

1. 代理模式大家都用过,但用抽象基类NSProxy实现代理估计鲜有人用

2. 本人用NSProxy实现了代理模式,对于理解消息转发机制有点帮助

源码

https:///YouXianMing/iOS-Design-Patterns

// // AbstractProxy.h // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <Foundation/Foundation.h> @interface AbstractProxy : NSProxy /** * 被代理对象 */ @property (nonatomic, weak) id customer; /** * 代理客户 * * @param customer 实现了某种协议的客户 * * @return 代理对象 */ - (instancetype)initWithCustomer:(id)customer; @end // // AbstractProxy.m // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <objc/runtime.h> #import "AbstractProxy.h" #import "AbstractExcute.h" @implementation AbstractProxy - (instancetype)initWithCustomer:(id)customer { self.customer = customer; return self; } #pragma mark - NSProxy - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { if ([self.customer respondsToSelector:aSelector]) { return [self.customer methodSignatureForSelector:aSelector]; } else { AbstractExcute *excute = [AbstractExcute shareInstance]; return [excute methodSignatureForSelector:NSSelectorFromString(@"nullExcute:")]; } } - (void)forwardInvocation:(NSInvocation *)invocation { SEL selector = [invocation selector]; if ([self.customer respondsToSelector:selector]) { [invocation setTarget:self.customer]; [invocation invoke]; } else { NSString *selectorString = NSStringFromSelector(invocation.selector); invocation.selector = NSSelectorFromString(@"nullExcute:"); AbstractExcute *excute = [AbstractExcute shareInstance]; [invocation setTarget:excute]; const char *className = class_getName([self class]); NSArray *classNameArray = nil; if (self.customer) { classNameArray = @[[NSString stringWithUTF8String:className], selectorString, @""]; } else { classNameArray = @[[NSString stringWithUTF8String:className], selectorString]; } [invocation setArgument:&classNameArray atIndex:2]; [invocation invoke]; } } @end // // AbstractExcute.h // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <Foundation/Foundation.h> @interface AbstractExcute : NSObject + (instancetype)shareInstance; @end // // AbstractExcute.m // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import "AbstractExcute.h" @implementation AbstractExcute + (instancetype)shareInstance { static AbstractExcute *sharedAbstractExcute = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedAbstractExcute = [[self alloc] init]; }); return sharedAbstractExcute; } - (void)nullExcute:(NSArray *)className { if (className.count == 3) { NSLog(@"%@ 设置了代理,但该代理没有实现 %@ 方法", className[0], className[1]); } else { NSLog(@"%@ 没有设置代理,方法 %@ 没有执行", className[0], className[1]); } } @end

细节

NSProxy子类实现的关键所在

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24927.html

    分享给朋友:

    “iOS设计模式 - 代理iOS开发设计模式” 的相关文章

    搬瓦工带防御:如何提升VPS安全性,抵御DDoS攻击

    搬瓦工VPS的基本介绍 搬瓦工(Bandwagon Host)作为一家知名的VPS提供商,以其稳定的网络连接和出色的性能赢得了众多用户的青睐。无论是个人网站搭建、企业应用部署,还是科学上网需求,搬瓦工VPS都能提供灵活且高效的解决方案。它的价格相对亲民,同时支持多种操作系统和自定义配置,满足了不同用...

    如何高效购买服务器?全面指南助你轻松选择最佳配置

    在决定购买服务器之前,做好充分的准备是至关重要的。服务器的选择直接影响企业的运营效率和未来发展,因此我们需要从多个角度进行考量。 确定企业需求 企业的需求是选择服务器的核心依据。我们需要明确服务器的主要用途,比如是用于数据存储、网站托管,还是进行大规模计算。不同的应用场景对服务器的性能要求差异很大。...

    香港 CN2 GIA: 提升国际网络连接的高质量解决方案

    CN2 GIA 的定义与背景 在数字时代,网络的质量直接影响着我们的生活。香港 CN2 GIA是中国电信推出的一项高品质专线服务,它为企业和个人提供高速、稳定的国际互联网连接。CN2的全称是“China Next Generation Internet”,而GIA则代表“Global Interne...

    高防服务器:企业网络安全的坚固堡垒

    在这个数字化日益加深的时代,我们的生活、工作和娱乐都越来越依赖于互联网。随之而来的,则是网络安全问题的加剧。其中,高防服务器作为提升网络安全性的重要工具,逐渐引起大家的关注。 高防服务器,顾名思义,就是专门设计用来抵御各种网络攻击,特别是DDoS攻击的服务器。简而言之,它就像是一个坚固的堡垒,能够有...

    Windows SSH密钥登录:安装、配置及问题解决指南

    在现代计算环境中,SSH(Secure Shell)是一种重要的网络协议,它为安全远程登录提供了一种简便的解决方案。SSH允许用户通过不安全的网络访问远程计算机,确保数据传输过程中的安全性和完整性。对于那些需要远程连接服务器的用户来说,了解SSH的基本概念是非常必要的。 SSH不仅仅是一个远程登录工...

    如何选择和配置GPU服务器,实现高效计算

    在我的技术探索旅程中,GPU服务器一直是一个令人着迷的话题。说到GPU服务器,那么我们首先得弄明白什么是GPU服务器。通俗来讲,GPU服务器就是一种配备了图形处理单元(GPU)的服务器,它主要用于处理复杂的计算任务,尤其在机器学习、深度学习以及图形渲染等领域表现尤为出色。这种服务器能加速数据处理,显...