参考小示例,代码如下:

#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. 反射 学习笔记之Class类的使用

    1  java世界中万事万物皆对象,除了2个特殊情况 int float等这些基本数据类型,(但是也都有Integer和Float等封装类做了弥补) java staic定义的,它不是属于对象的,而是 ...

  2. Android实现系统下拉栏的消息提示——Notification

    Android实现系统下拉栏的消息提示--Notification 系统默认样式 默认通知(通用) 效果图 按钮 <Button android:layout_width="match ...

  3. 07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

     1  创建day14数据库,创建user.sql表: A 创建数据库 day14 B 创建数据表 users create table users ( id int primary keyaut ...

  4. FFmpeg源代码简单分析:configure

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

  5. TCP的发送系列 — tcp_sendmsg()的实现(一)

    主要内容:Socket发送函数在TCP层的实现 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 上一篇blog讲的是send().sendto().sen ...

  6. javascript中的XML

    IE下创建DOM并载入XML var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.load(url); //载入X ...

  7. java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

    一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...

  8. 1.Maven+SpringMVC+Eclipse软件安装配置,Maven报插件错误,Eclipse总是卡死的解决办法,导入一个maven工程后 一直显示importing maven project

     使用Maven+SpringMVC+Eclipse软件安装配置过程中的问题: 1.Eclipse总是卡死的解决办法: 一:内存不足所以会卡死,配置一下eclipse.ini修改这几个值就好了-X ...

  9. 使用JavaScript动态的添加组件

    使用JavaScript进行动态的网页窗体组件的添加是一件很方便也很容易实现的事情.话不多说,边看代码边做解释吧. 准备工作 由于html页面中不可以添加java代码,所以我在jsp页面中进行了测试. ...

  10. 如何在Cocos2D 1.0 中掩饰一个精灵(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...