-
-
1.在 iOS中可以直接调用某个对象的消息方式有两种:
-
一种是performSelector:withObject;
-
再一种就是NSInvocation。
-
第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作。
-
-
2.NSInvocation的作用:
- 用来包装方法和对应的对象, 它可以存储方法的名称,对应的对象 ,对应的参数
-
3.NSInvocation的使用步骤
- (1).创建一个NSInvocation对象
- (2).调用NSInvocation对象的invoke方法
-
4.使用NSInvocation时的注意点:
- (1).在创建NSInvocation的时候, 必须传递一个签名对象
- (2).给invocation设置的方法, 必须和签名中的方法一致
-
5.NSInvocation的签名(NSMethodSignature)的使用
- (1).签名对象的作用:
- 用于获取参数的个数和方法的返回值
- (2).注意点:
- 创建签名对象的时候不是使用NSMethodSignature类创建而是方法属于谁就用谁来创建
- (1).签名对象的作用:
- 6.NSInvocation使用范例
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 创建签名 NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithNumber:andContent:status:)]; // 1.创建一个NSInvocation对象 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; // 1.1保存方法所属的对象 invocation.target = self; // 1.2保存方法名称 // 注意:给invocation设置的方法, 必须和签名中的方法一致 invocation.selector = @selector(sendMessageWithNumber:andContent:status:); // 1.3设置传递的参数 // 第一个参数: 需要给指定方法传递的值 // + 第一个参数需要接收一个指针, 也就是传递值的时候需要传递地址 // 第二个参数: 需要给指定方法的第几个参数传值 NSString *number = @"10086"; // 注意: 设置参数的索引时不能从0开始, 因为0已经被self占用, 1已经被_cmd占用 [invocation setArgument:&number atIndex:2]; NSString *content = @"love"; [invocation setArgument:&content atIndex:3]; NSString *status = @"success"; [invocation setArgument:&status atIndex:4]; // 2.调用NSInvocation对象的invoke方法 // 只要调用invocation的invoke方法, 就代表需要执行NSInvocation对象中指定对象的指定方法, 并且传递指定的参数 [invocation invoke]; } // 不带参数的方法 - (void)call { NSLog(@"%s", __func__); } // 带1个参数的方法 - (void)callWithNumber:(NSString *)number { NSLog(@"打电话给%@", number); } // 带2个参数的方法 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content { NSLog(@"发信息给%@, 内容是%@", number, content); } // 带3个参数的方法 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content status:(NSString *)status { NSLog(@"发信息给%@, 内容是%@, 发送的状态是%@", number, content, status); } @end
-
-
-
OC-NSInvocation的简单运用
最新推荐文章于 2022-05-22 19:34:39 发布