zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Java生鲜电商平台-物流配送的设计与架构
    五分钟学Java:如何学习Java面试必考的网络编程
    五分钟学Java:如何学习Java面试必考的网络编程
    Java原来还可以这么学:如何搞定面试中必考的集合类
    五分钟学Java:如何学习Java面试必考的JVM虚拟机
    先搞清楚这些问题,简历上再写你熟悉Java!
    MySql/Oracle和SQL Server的分页查
    Java面试题之int和Integer的区别
    Java基本数据类型转换
    Shiro-Subject 分析
  • 原文地址:https://www.cnblogs.com/swallow37/p/4203835.html
Copyright © 2011-2022 走看看