NSMethodSignature和NSInvocation的用法
<p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span class="kwd" style="color: rgb(0, 0, 136);">interface</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">LOCBird</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSObject</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSString</span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln"> name_</span><span class="pun" style="color: rgb(102, 102, 0);">;</span> <span class="pln"> </span> <span class="pun" style="color: rgb(102, 102, 0);">}</span> <span class="lit" style="color: rgb(0, 102, 102);">@end</span><span class="lit" style="color: rgb(0, 102, 102);">@implementation</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">LOCBird</span><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">id</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">init</span> <span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="kwd" style="color: rgb(0, 0, 136);">super</span><span class="pln"> init</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> name_ </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[[</span><span class="typ" style="color: rgb(102, 0, 102);">NSString</span><span class="pln"> alloc</span><span class="pun" style="color: rgb(102, 102, 0);">]</span><span class="pln"> initWithString</span><span class="pun" style="color: rgb(102, 102, 0);">:@</span><span class="str" style="color: rgb(0, 136, 0);">"I am a Bird!!"</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">return</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pun" style="color: rgb(102, 102, 0);">;</span> <span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">dealloc</span> <span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">name_ release</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="kwd" style="color: rgb(0, 0, 136);">super</span><span class="pln"> dealloc</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">NSMethodSignature</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*)</span><span class="pln">methodSignatureForSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:(</span><span class="pln">SEL</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">aSelector</span> <span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSMethodSignature</span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln"> signature </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="kwd" style="color: rgb(0, 0, 136);">super</span><span class="pln"> methodSignatureForSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">aSelector</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">signature</span><span class="pun" style="color: rgb(102, 102, 0);">==</span><span class="kwd" style="color: rgb(0, 0, 136);">nil</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> signature </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">name_ methodSignatureForSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">aSelector</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSUInteger</span><span class="pln"> argCount </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">signature numberOfArguments</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">for</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">NSInteger</span><span class="pln"> i</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="lit" style="color: rgb(0, 102, 102);">0</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln"> i</span><span class="pun" style="color: rgb(102, 102, 0);"><</span><span class="pln">argCount </span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln"> i</span><span class="pun" style="color: rgb(102, 102, 0);">++)</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSLog</span><span class="pun" style="color: rgb(102, 102, 0);">(@</span><span class="str" style="color: rgb(0, 136, 0);">"%s"</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">signature getArgumentTypeAtIndex</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">i</span><span class="pun" style="color: rgb(102, 102, 0);">]);</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSLog</span><span class="pun" style="color: rgb(102, 102, 0);">(@</span><span class="str" style="color: rgb(0, 136, 0);">"returnType:%s ,returnLen:%d"</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">signature methodReturnType</span><span class="pun" style="color: rgb(102, 102, 0);">]</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">signature methodReturnLength</span><span class="pun" style="color: rgb(102, 102, 0);">]);</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSLog</span><span class="pun" style="color: rgb(102, 102, 0);">(@</span><span class="str" style="color: rgb(0, 136, 0);">"signature:%@"</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> signature</span><span class="pun" style="color: rgb(102, 102, 0);">);</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">return</span><span class="pln"> signature</span><span class="pun" style="color: rgb(102, 102, 0);">;</span> <span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">forwardInvocation</span><span class="pun" style="color: rgb(102, 102, 0);">:(</span><span class="typ" style="color: rgb(102, 0, 102);">NSInvocation</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*)</span><span class="pln">anInvocation</span> <span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSLog</span><span class="pun" style="color: rgb(102, 102, 0);">(@</span><span class="str" style="color: rgb(0, 136, 0);">"forwardInvocation:%@"</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> anInvocation</span><span class="pun" style="color: rgb(102, 102, 0);">);</span> <span class="pln"> SEL seletor </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">anInvocation selector</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">([</span><span class="pln">name_ respondsToSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">seletor</span><span class="pun" style="color: rgb(102, 102, 0);">])</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">anInvocation invokeWithTarget</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">name_</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span> <span class="pln"> </span> <span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="lit" style="color: rgb(0, 102, 102);">@end</span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"> </p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span class="com" style="color: rgb(136, 0, 0);">//调用</span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span class="com" style="color: rgb(136, 0, 0);"> id bird = [[LOCBird alloc] init];</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSLog</span><span class="pun" style="color: rgb(102, 102, 0);">(@</span><span class="str" style="color: rgb(0, 136, 0);">"len= %d"</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">bird length</span><span class="pun" style="color: rgb(102, 102, 0);">]);</span></p>
输出 参考
编码 |
含义 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C++标准的 |
|
|
|
字符串( |
|
对象(无论是静态指定的还是通过 |
|
类( |
|
方法选标( |
[array type] |
数组 |
{name=type...} |
结构体 |
(name=type...) |
联合体 |
|
num个bit的位域 |
|
type类型的指针 |
|
未知类型(其它时候,一般用来指函数指针) |
<p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span class="pun" style="color: rgb(102, 102, 0);">-(</span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln"> initWithTarget</span><span class="pun" style="color: rgb(102, 102, 0);">:(</span><span class="pln">id</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln"> rec selector</span><span class="pun" style="color: rgb(102, 102, 0);">:(</span><span class="pln">SEL</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln"> cb</span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> anchorPoint_ </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> ccp</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="lit" style="color: rgb(0, 102, 102);">0.5f</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102);">0.5f</span><span class="pun" style="color: rgb(102, 102, 0);">);</span> <span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">NSMethodSignature</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln"> sig </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">nil</span><span class="pun" style="color: rgb(102, 102, 0);">;</span> <span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln"> rec </span><span class="pun" style="color: rgb(102, 102, 0);">&&</span><span class="pln"> cb </span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span> <span class="pln"> sig </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">rec methodSignatureForSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">cb</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> invocation </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">nil</span><span class="pun" style="color: rgb(102, 102, 0);">;</span> <span class="pln"> invocation </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="typ" style="color: rgb(102, 0, 102);">NSInvocation</span><span class="pln"> invocationWithMethodSignature</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">sig</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">invocation setTarget</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">rec</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">invocation setSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">cb</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">invocation setArgument</span><span class="pun" style="color: rgb(102, 102, 0);">:&</span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pln"> atIndex</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">2</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">invocation retain</span><span class="pun" style="color: rgb(102, 102, 0);">];</span> <span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span> <span class="pun" style="color: rgb(102, 102, 0);">}</span></p>
当 [invocation invoke];是调用SEL。上述第二个参数为自身。
- - (void)encodeWithCoder:(NSCoder *)encoder{
- NSDictionary *attrDic = [self getKeyAndObjectForDictionry];
- if (attrDic == nil) {
- return;
- }
- NSEnumerator *keyEnum = [attrDic keyEnumerator];
- id attributeName;
- while ((attributeName = [keyEnum nextObject])) {
- SEL getSel = NSSelectorFromString(attributeName);
- if ([self respondsToSelector:getSel]) {
- NSMethodSignature *signature = nil;
- signature = [self methodSignatureForSelector:getSel];
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
- [invocation setTarget:self];
- [invocation setSelector:getSel];
- NSObject *valueObj = nil;
- [invocation invoke];
- [invocation getReturnValue:&valueObj];
- if (valueObj) {
- [encoder encodeObject:valueObj forKey:attributeName];
- }
- }
- }
- }
NSMethodSignature和NSInvocation的用法相关推荐
- iOS项目组件化历程
为什么要组件化 随着业务的发展,App中的页面,网络请求,通用弹层UI,通用TableCell数量就会剧增,需求的开发人员数量也会逐渐增多. 如果所有业务都在同一个App中,并且同时开发人数较少时,抛 ...
- 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
本文旨在总结iOS知识网络,知识点,该知识网络罗列出常见UIKit.Foundation的对象特点和一些使用经验,可以看成是一本书:文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望 ...
- 自己学习Foundation一些类
一些类 NSDecimalNumber 数字精准计算 NSCache 线程安全的Memory缓存 NSCharacterSet 字符串分割.过滤等 NSEnergyFormatter 以焦耳和卡路里作 ...
- Swift与Objective-C交互
在同一个工程中是可以同时使用Swift和OC的,但不可以同时出现在同一个文件中. OC调用Swift相关信息的方法 在***.m文件中导入工程名-Swift.h即可. 如工程名为ABC,则在需要使用S ...
- NSInvocation的一种用法
大家知道NSInvocation可以用来发起一次target对action的调用,还可以携带任意多的参数,它比NSObject的performSelector更为强大... 最近在做静态库,为了对一组 ...
- NSInvocation
IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息.但是perform相关的这些函数,有一个局限性,其参数数量不能 ...
- IOS NSInvocation应用与理解
IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息.但是perform相关的这些函数,有一个局限性,其参数数量不能 ...
- @dynamic 模拟NSManagedObject类的内部实现,AFN的非常规用法
@property和@synthesize复习 @property生成setter和getter的声明,同时生成属性对应的成员变量,并且前面加一个下划线_.如果将getter和setter的实现同时重 ...
- iOS之NSInvocation详解
一.NSInvocation的基本用法 在 iOS中可以直接调用某个对象的消息方式有两种: 一种是performSelector:withObject: 再一种就是NSInvocation. 第一种方 ...
最新文章
- java十六进制转二进制_Java进制都有哪些?
- 资深算法工程师万宫玺:Java工程师转型AI的秘密法宝——深度学习框架Deeplearning4j | 分享总结
- 989-数组形式的整数加法
- javascript要点
- 网络验证php接口逆向,一个专利查错的逆向(网络验证)
- 【Linux】linux grep过滤中,不包含某些字符串
- 二十四 Redis消息订阅事务持久化
- Linux命令解释之fdisk
- centos 安装mysql5.7
- 【入门】PyTorch文本分类
- 原生开发跟混合开发?两者有什么区别?
- Android实战之 上传头像 和仿QQ空间、微博发表文字和图片
- VBA和VBScript的AES加密算法
- Vivado 信号混频设计
- 【板栗糖GIS】WPS-怎么在表格里设置超链接并修改风格
- 在船舶共轨实验平台上使用Mbed LPC1768
- 服务器系统关机了怎么办,各种服务器系统的关机
- 由浅入深学习Flash制作高射炮游戏(2)
- Ubuntu18.04 安装 Idea 2018.2 Ultimate
- Pad application for ordering (应用之酒店点菜系统)
热门文章
- python的datetime举例_Python datetime.timedelta()用法及代码示例
- python关联分析引擎_PowerBI x Python 之关联分析(上)
- 我是Python小玩家,一行代码能做哪些炫酷的事情 (三十一)
- 二十五、Kaggle | 全球听众最多的50首歌曲
- 当Swin Transformer遇上DCN,清华可变形注意力Transformer模型优于多数ViT
- 北京内推 | 腾讯云小微自然语言技术中心招聘NLP研究型实习生
- 用最简单的方式训练史上最强ResNet-50,性能超过魔改结构的ResNeSt
- 视角不平衡立体匹配研究
- 岗位推荐 | 腾讯AI Lab多媒体算法组招聘正式员工和实习生
- Fashion-MNIST数据集发布一周年,论文引用量超250篇