利用NSInvocation给NSObject添加一个分类方法,解决传递多参数问题

针对NSObject类中不能满足超过2个参数的消息调用问题,本文通过添加一个分类方法`performSelector:withObjects:`,利用NSInvocation实现传递多个参数的功能。详细介绍了分类的声明、实现及其实例程序的运行结果。
  • 1.添加分类的原因
    • NSObject类自带的调用消息方式,只能满足参数小于等于2的情况,当参数大于2时并不适用,所以通过NSInvocation给NSObject添加一个分类方法performSelector:withObjects:方法,来解决传递多参数问题
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
  • 2.具体封装类如下:
    • NSObject+performSelector.h声明部分
#import <Foundation/Foundation.h>

@interface NSObject (performSelector)
/** 扩展NSObject对象的消息方式:performSelector:withObject */
- (id)performSelector:(SEL)aSelector withObjects:(NSArray *)objects;
@end
  • NSObject+performSelector.m 实现部分
Objective-C中,如果你想要在一个类中调用另一个类的方法,并将一个回调函数作为参数传递,通常会使用blocks、NSInvocation或者委托(Delegation)模式。 1. **Blocks**: 可以将Block作为一种参数传递给其他方法。例如: ```objective-c -(void)someMethodWithCallback:(void(^)(NSString *result))callback { // 执行一些操作 NSString *result = ...; callback(result); } ``` 2. **NSInvocation**: 如果需要动态地调用某个方法,可以创建一个NSInvocation实例并设置其目标和 selector,然后在适当的时候发送invocation消息: ```objective-c void (^myCallback)(id result) = ^{ ... }; NSMethodSignature *signature = [self class].instanceMethodSignatureForSelector:@selector(callbackMethod:); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:@selector(callbackMethod:)]; [invocation setTarget:self]; [invocation invokeWithObject:result]; ``` 3. **委托模式 (Delegation)**: 将回调方法暴露在协议中,让其他对象遵守这个协议并在特定时刻调用该方法。比如: ```objective-c @protocol CallbackProtocol - (void)performTaskWithCompletion:(void(^)(BOOL success, NSError *error))completion; @end -(void)startTaskWithCompletion:(void(^)(BOOL success, NSError *))completion { // 调用委托对象的方法 [self.delegate performTaskWithCompletion:completion]; } ``` 记得,在使用这些方法时,确保接收方的对象实现了相应的协议或方法,并且理解回调何时以及如何执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值