参考小示例,代码如下:

#import <Foundation/Foundation.h>

@interface PlayList:NSObject
@property NSMutableArray *ary;
@end

@implementation PlayList

-(id)init{
    self = [super init];
    if(self){
        _ary = [NSMutableArray array];
    }
    return self;
}

-(NSMethodSignature *)methodSignatureForSelector:(SEL)selector{
    NSString *sel_name = NSStringFromSelector(selector);
    NSLog(@"%s:%@",__func__,sel_name);
    NSMethodSignature *sig = [_ary methodSignatureForSelector:selector];
    if(sig){
        //NSLog(@"%s:%@",__func__,sig);
        show_sig([sel_name UTF8String],sig);
        return sig;
    }
    return [super methodSignatureForSelector:selector];
}

-(void)forwardInvocation:(NSInvocation *)x{
    NSLog(@"%s:%@",__func__,x);
    [x invokeWithTarget:_ary];
}

void show_sig(const char* sig_name,NSMethodSignature *sig){
    const char *ret_type = [sig methodReturnType];
    NSUInteger arg_count = [sig numberOfArguments];
    NSLog(@"show sig for #%s# :",sig_name);
    NSLog(@"ret_type:%s , stack_len:%lu argc:%lu",ret_type,[sig frameLength],arg_count);

    for(int i = 0;i<arg_count;i++){
        printf("arg %d : %s ",i,[sig getArgumentTypeAtIndex:i]);
    }
    puts("");
}

-(NSUInteger)countOfAry{
    return [_ary count];
}

-(NSString *)description{
    NSLog(@"enter %s",__func__);
    return [NSString stringWithFormat:@"%@:%@",[self class],self.ary];
}
@end

int main(void){
    @autoreleasepool{
        PlayList *pl = [PlayList new];
        id ary_proxy = [pl mutableArrayValueForKey:@"ary"];
        NSLog(@"count is %ld(%ld)",[ary_proxy count],[pl countOfAry]);
        NSLog(@"%@",pl);

        id obj = pl;
        [obj addObject:@"hello"];
        [obj addObject:@"love"];
        //[obj love:@"panda" and:@"penguin"];
        NSLog(@"%@ has %lu",obj,[obj count]);
    }
    return 0;
}

obj-c中SEL签名和Invocation示例的更多相关文章

  1. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

  2. 【转】Thunderbird中配置签名

    原文网址:https://support.mozilla.org/zh-CN/kb/Thunderbird%E4%B8%AD%E9%85%8D%E7%BD%AE%E7%AD%BE%E5%90%8D “ ...

  3. 转: Android中的签名机制

    转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK 签名比对 发布过Android应用 ...

  4. [Android Pro] 查看 keystore文件的签名信息 和 检查apk文件中的签名信息

    1: 查看 keystore文件的签名信息 keytool -list -v -keystore keystoreName -storepass keystorePassword 2: 检查apk文件 ...

  5. Java中的break循环——通过示例学习Java编程(13)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=24 break语句通常用于以下两种情况: (A)使 ...

  6. SignatureDoesNotMatch REST接口 在任何时间、任何地点、任何互联网设备上 在Header中包含签名

    PutObject_关于Object操作_API 参考_对象存储 OSS-阿里云 https://help.aliyun.com/document_detail/31978.html OSS API ...

  7. ioctl在socket中的一些用法及示例

    原文: http://blog.chinaunix.net/uid-20692625-id-3172833.html ----------------------------------------- ...

  8. Three.js中的group,obj,模型中layers层级与相机

    目录 Three.js中的group,obj,模型中layers层级与相机 layers group中的.layers.mask设置 一些设想 Three.js中的group,obj,模型中layer ...

  9. 使用注解注入properties中的值的简单示例

    spring使用注解注入properties中的值的简单示例   1.在web项目的src目录下新建setting.properties的文件,内容如下: version=1 2.在spring的xm ...

随机推荐

  1. 统计处理包Statsmodels: statistics in python

    http://blog.csdn.net/pipisorry/article/details/52227580 Statsmodels Statsmodels is a Python package ...

  2. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  3. JAVA面向对象-----内部类的概述

    JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...

  4. Java基本语法-----java二维数组

    由于word里的样式在csdn上调太麻烦了,所以我再次贴图了,后面二维数组那里是文字的,大家将就看吧. 二维数组常见的操作: 1.遍历二维数组 2.对二维数组求和 class Demo { // 定义 ...

  5. [ExtJS5学习笔记]第二十九节 sencha ext js 5.1.0中动态更换皮肤主题

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/42016107 本文作者:sushengmiyan ------------------ ...

  6. JDBC编程-事务编程(四)

    事务的概念 事务的概念在我看来是指的是一组sql序列,这个序列是一块执行的单位,要么全部执行,要不全部执行,这样可以很好的对数据库进行并发控制. 因为数据库是多个用户都可以同时操作的,如果多个用户同时 ...

  7. 4.QPixmap,QTransform,绘图函数的使用

     新建一个项目Painter MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class MyW ...

  8. FFmpeg源代码简单分析:avio_open2()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  9. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  10. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...