NSMethodSignature和NSInvocation的用法

NSMethodSignature顾名思义应该就是“方法签名”,类似于C++中的编译器时的函数签名。

官方定义该类为对方法的参数、返回类似进行封装,协同NSInvocation实现消息转发。

通过消息转发可以用B实现A的方法。也是一种多重继承的解决方法。

在 iOS中可以直接调用 某个对象的消息 方式有2种

一种是performSelector:withObject:

再一种就是NSInvocation

第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作

NSInvocation可以处理参数、返回值。会java的人都知道反射操作,其实NSInvocation就相当于反射操作。

使用一:通过下例得到myName长度

interface LOCBird : NSObject

{

NSString* myName;

}

@end

@implementation LOCBird

- (id)init

{

self = [super init];

if (self)

{

myName = @"I am a Bird!!"];

}

return self;

}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

{

NSMethodSignature* signature = [super methodSignatureForSelector:aSelector];

if (signature==nil)

{

signature = [myName methodSignatureForSelector:aSelector];

}

}

- (void)forwardInvocation:(NSInvocation *)anInvocation

{

NSLog(@"forwardInvocation:%@" , anInvocation);

SEL seletor = [anInvocation selector];

if ([myName respondsToSelector:seletor])

{

[anInvocation invokeWithTarget:myName];

}

}

@end

//调用

id bird = [[LOCBird alloc] init];

NSLog(@"len= %d", [bird length]);//  len= 13

使用二:定时调用

SEL selector = @selector(myMethod:withParam2:);

NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

[invocation setSelector:selector];

NSString *str1 = @"someString";

NSString *str2 = @"someOtherString";

//The invocation object must retain its arguments

//Set the arguments

[invocation setTarget:self];

[invocation setArgument:&str1 atIndex:2];//参数位置 atIndex的下标必须从2开始。原因为:0 1 两个参数已经被target 和selector占用

[invocation setArgument:&str2 atIndex:3];

[NSTimer scheduledTimerWithTimeInterval:3.0 invocation:invocation repeats:YES];

-(NSString *)myMethod:(NSString *)param1 withParam2:(NSNumber *)param2

{

NSString *result = @"objc";

NSLog(@"par = %@",param1);

NSLog(@"par 2 = %@",param2);

return result;

}

每3秒输出:

par = someString

par 2 = someOtherString

总结:没感觉到有实质的用途,仅做了解之用

时间: 2024-08-13 12:37:18

NSMethodSignature和NSInvocation的用法的相关文章

NSMethodSignature和NSInvocation的使用(方法传多参数)

动态调用方法时会用到,例子 -(NSString *)myMethod:(NSString *)param1 withParam2:(NSNumber *)param2 {     NSString *result = @"objc";     NSLog(@"par = %@",param1);     NSLog(@"par 2 = %@",param2);     return result; } -(void)invokeMyMethod

iOS知识树,知识目录(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)

本文旨在总结iOS知识网络,该知识网络罗列出常见UIKit,Foundation的对象特点和一些使用经验:文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望对初学者有用或给一些解决疑难杂症者提供思路:某些知识点会深入探讨:通过总结希望站在一个较高平台的角度全观Objective-C.知识树中有些是原创文章,有些则是转载网络上iOS大神的文章.笔者会尽量详细的介绍各个知识点.当然一个人的知识面是相当有限的,在给各位读者提供知识参考的同时,欢迎大家对本文提意见. /->UIView

Swift与Objective-C交互

在同一个工程中是可以同时使用Swift和OC的,但不可以同时出现在同一个文件中. OC调用Swift相关信息的方法 在***.m文件中导入工程名-Swift.h即可. 如工程名为ABC,则在需要使用Swift相关信息的.m文件中#import "ABC-Swift.h"即可. Swift调用OC相关信息的方法 当在Swift/OC工程中创建OC/Swift文件时,会有提示,如下图 点击Yes,会创建一个工程名-Bridging-Header.h的文件,将Swift使用的相关OC的.h文

OC与JS混合开发

随着iOS开发的成本增大,越来越多的公司开始使用html5混合开发软件了,因为使用原生的开发花费的成本跟时间都很大,而使用html5来搭建界面会方便很多,效率相对而言也提高了.虽然使用UIWebView实现的交互效果与原生效果相比还是会大打折扣,这类界面通常没有复杂的交互效果,所以现在主流应用大多采用混合开发.花了几天时间,把JS的基础全部看了一遍,又研究了一下巧神的书,写了一个iOS7以前的JS与OC混合开发的demo. 既然是html5页面搭建的布局,那么肯定是得有html5页面的,所以首先

ios waxpatch lua语法

Wax Lua 使用方法 说一下 Wax 的特点,它支持你在脚本里使用任何 OC 的类,同样也支持你创建一个类. 使用一个类时你会这样使用: 1 2 NSString -- Returns the NSString class UIView -- Returns the UIView class 这样调用其实一个语法糖,实际上他调用的是wax.class[“UIView “],但是我们在使用的时候不需要知道这些,因为在这个框架里已经通过设置元表的方法实现了这一点. 当定义一个类的时候会是这样:

NSInvocation的基本用法

@在 iOS中可以直接调用某个对象的消息方式有2种: 1.performSelector:withObject:                                         2.NSInvocation 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作. @其实也是工作所使,原先只是知道,但没实际的用过,果然工作的时候才会实际的区去运用各

IOS NSInvocation用法简介

[摘要]在 iOS中可以直接调用某个对象的消息方式有两种,其中一种就是NSInvocation,本文介绍IOS NSInvocation用法,并提供简单的示例代码供参考. 在 iOS中可以直接调用某个对象的消息方式有两种: 一种是performSelector:withObject: 再一种就是NSInvocation. 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定.那么在这种情况下,我们就可以使用NSInvocation来进行这些相

IOS NSInvocation应用与理解

IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息.但是perform相关的这些函数,有一个局限性,其参数数量不能超过2个,否则要做很麻烦的处理,与之相对,NSInvocation也是一种消息调用的方法,并且它的参数没有限制.这两种直接调用对象消息的方法,在IOS4.0之后,大多被block结构所取代,只有在很老的兼容性系统中才会使用,简单用法总结如下: 一.初始化与调用 在官方文档中有明确说明,NSInvoc

【转】IOS NSTimer 定时器用法总结

原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; -