返回顶部
首页 > 资讯 > 移动开发 >ios使用NSProxy实现消息转发
  • 497
分享到

ios使用NSProxy实现消息转发

2024-04-02 19:04:59 497人浏览 薄情痞子
摘要

简介 ​ 在 iOS 应用开发中,自定义一个类一般需要继承自 NSObject 类或者 NSObject 子类,但是,NSProxy 类不是继承自 NSObject 类或者 NSOb

简介

​ 在 iOS 应用开发中,自定义一个类一般需要继承自 NSObject 类或者 NSObject 子类,但是,NSProxy 类不是继承自 NSObject 类或者 NSObject 子类,而是一个实现了 NSObject 协议的抽象基类。



#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 的作用就是作为一个委托代理对象,将消息转发给一个真实的对象或者自己加载的对象。

为了进一步了解 NSProxy 类的作用,我们来实现一个同事调用 NSMutableString 和 NSMutableArray 两个类中的方法的委托类,模拟多继承。

首先创建 TargetProxy 类,让他继承 NSProxy。并实现初始化方法。

@interface TargetProxy : NSProxy


/// 初始化方法,保存两个真实对象
/// @param object1 第一个真实对象
/// @param object2 第二个真实对象
- (instancetype)initWithObject1:(id)object1 object2:(id)object2;

@end
@implementation TargetProxy {

    // 保存需要将消息转发到的第一个真实对象
    // 第一个真实对象的方法调用优先级会比第二个真实对象的方法调用优先级高
    id _realObject1;
    // 保存需要将消息转发到的第二个真实对象
    id _realObject2;
}

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

然后在 TargetProxy.m 文件中,重写 - methodSignatureForSelector: 获取真实对象方法签名,并重写 - forwardInvocation: 方法,调用真实的对象方法。

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    // 获取 _realObject1 中 sel 的方法签名
    NSMethodSignature *signature = [_realObject1 methodSignatureForSelector:sel];
    // 如果 _realObject1 中有该方法,那么返回该方法的签名
    // 如果没有,返回 _realObject1 方法签名
    if (signature) {
        return signature;
    }
    // 获取 _realObject1 中的 sel 的方法签名
    signature = [_realObject2 methodSignatureForSelector:sel];
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)invocation {
    // 获取拥有该方法的真实对象
    id target = [_realObject1 methodSignatureForSelector:[invocation selector]] ? _realObject1 : _realObject2;

    // 执行方法
    [invocation invokeWithTarget:target];
}

最后,进行 Demo 测试

- (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);
    }
}

运行上面的代码,输入日志如下:

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.

​ 以上说明,我们使用 TargetProxy 类成功的实现了消息转发。

​ 当然,在大部分情况下,使用 NSObject 类也可以实现消息转发,实现方式和 NSProxy 类似,但是大部分情况下使用 NSProxy 更加合适。因为:

  • NSProxy 类实现了包括 NSObject 协议在内基类所需的基础方法
  • 通过 NSObject 类实现的代理类不会自动的转发 NSObject 协议中的方法
  • 通过 NSObject 类实现的代理类不会自动的转发 NSObject 类别中的方法

 到此这篇关于ios使用NSProxy实现消息转发的文章就介绍到这了,更多相关ios NSProxy消息转发内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: ios使用NSProxy实现消息转发

本文链接: https://lsjlt.com/news/153337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ios使用NSProxy实现消息转发
    简介 ​ 在 iOS 应用开发中,自定义一个类一般需要继承自 NSObject 类或者 NSObject 子类,但是,NSProxy 类不是继承自 NSObject 类或者 NSOb...
    99+
    2024-04-02
  • SpringBoot怎么使用WebSocket实现群发消息
    这篇文章主要介绍了SpringBoot怎么使用WebSocket实现群发消息的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么使用WebSocket实现群发消息文章都会有所收获,下面我们一起...
    99+
    2023-06-08
  • 使用PHP实现消息队列的开发
    随着现代互联网应用对高并发、高吞吐量和高可靠性的要求越来越高,消息队列作为一种异步解耦系统架构方式越来越被应用在互联网领域的各个方面。其原理是先将消息发送到消息队列中,等待异步消费,从而达到解耦的目的,提高系统的可扩展性与可维护性。在目前市...
    99+
    2023-05-25
    PHP 消息队列 开发
  • C# Winform 实现TCP发消息
    目录服务端:窗体代码:客户端:窗体代码运行结果:服务端: 窗体 代码: using System; using System.Collections.Generic; usin...
    99+
    2024-04-02
  • IOS开发仿微信消息长按气泡菜单实现效果
    目录正文使用方法导入项目使用对比微信实现效果正文 话不多说,直接上效果图 使用方法 导入项目 代码地址:github.com/shangjie119… 将SJPopM...
    99+
    2024-04-02
  • RocketMQ Broker实现高可用高并发的消息中转服务
    目录RocketMq-broker注册消息存储消息读取消费者拉取消息按照key查询RocketMq-broker broker主要作用就是存储消息。所以重点就放在它对于消息的处理上面...
    99+
    2023-05-17
    RocketMq Broker RocketMq Broker消息中转
  • iOS开发实现转盘功能
    本文实例为大家分享了iOS实现转盘功能的具体代码,供大家参考,具体内容如下 今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看 ViewController #pragm...
    99+
    2022-05-27
    iOS 转盘
  • 使用python怎么实现企业微信发送消息
    这篇文章给大家介绍使用python怎么实现企业微信发送消息,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、需要的参数1、通讯用户:touser 或 通讯组:toparty  &...
    99+
    2023-06-15
  • 使用Spring Boot和Kafka实现消息发送和订阅
    文章目录 一,新建Spring Boot1,Maven配置2,无法识别为SpringBoot项目3,无效的源发行版4,无法访问SpringApplication5,运行直接Finish6,服务...
    99+
    2023-09-05
    spring boot kafka 后端 订阅 消息队列
  • 微信小程序API转发消息功能怎么实现
    这篇文章主要讲解了“微信小程序API转发消息功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序API转发消息功能怎么实现”吧!转发消息如果小程序设置了消息推送,普通微信用户...
    99+
    2023-06-26
  • C#用RabbitMQ实现消息订阅与发布
    目录Fanout交换机模型RabbitMQ控制台操作新增两个队列绑定fanout交换机示例效果图核心代码消息发布消息订阅Fanout交换机模型 扇形交换机,采用广播模式,根据绑定的...
    99+
    2024-04-02
  • C#怎么使用udp实现消息的接收和发送
    本篇内容主要讲解“C#怎么使用udp实现消息的接收和发送”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用udp实现消息的接收和发送”吧!使用udp实现消息的接收和发送代码比较简单,但是...
    99+
    2023-07-05
  • C#使用udp如何实现消息的接收和发送
    目录使用udp实现消息的接收和发送C# 运用UDP服务端界面客户端界面总结使用udp实现消息的接收和发送 代码比较简单,但是别忘记关闭防火墙进行测试。 首先便是服务端,使用Socke...
    99+
    2023-02-26
    C#使用udp udp消息接收 udp消息发送
  • 使用Python实现给企业微信发送消息功能
    目录一、概述二、python脚本三、企业微信设置1. 注册企业微信2. 点击进入管理后台3. 创建应用完成后4. 查看企业id5. 查看部门id四、测试脚本一、概述 本文将介绍如何使...
    99+
    2024-04-02
  • python实现定时发送qq消息
    因为生活中老是忘记各种事情,刚好又在学python,便突发奇想通过python实现提醒任务的功能(尽管TIM有定时功能),也可定时给好友、群、讨论组发送qq消息。其工作流程是:访问数据库提取最近计划——>根据数据内容(提醒时间、提醒...
    99+
    2023-01-31
    消息 python qq
  • Android使用广播发送消息
    本文实例为大家分享了Android使用广播发送消息的具体代码,供大家参考,具体内容如下 1.activity_main.xml  <xml version="1.0...
    99+
    2024-04-02
  • 如何使用redis实现消息队列
    使用redis实现消息队列的示例:redis的pubsub功能实现发布订阅模式,代码:import redisclass Task(object):def __init__(self):self.rcon = redis.StrictRed...
    99+
    2024-04-02
  • Android 消息分发使用EventBus的实例详解
    Android 消息分发使用EventBus的实例详解1. AndroidStudio使用dependencies { //最新版本 compile 'org.greenrobot:eventbus:3.0.0' //可以翻倍提高E...
    99+
    2023-05-30
    android eventbus roi
  • 前端基于uniapp[uniPush]实现APP消息推送(安卓、IOS)
    前提概述:此文章都是基于uniapp中uniPush2实现的在线、离线推送 app消息推送流程 登录开发者中心先填写好项目信息以及配置厂商在manifest.json文件中勾选推送模块打包自定义基座在前端项目中创建云函数(此云函数的作用是接...
    99+
    2023-08-19
    ios 前端 uni-app
  • Redis使用ZSET实现消息队列使用小结
    目录1.Redis 用zset做消息队列如何处理消息积压2.redis分片并使用zset做消息队列3. redis如何分片4. redis使用Java发送消息到zset队列并对消息进行分片处理5. redis使用zset...
    99+
    2023-03-19
    Redis使用ZSET实现消息队列 Redis消息队列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作