objective-c中类似ruby枚举类的实例方法

虽然obj-c的语法格式略显繁琐,但它和ruby都从某些方面继承了smalltalk的某些动态的东西。这些东西是
C和C++之类的静态语言所不曾有的。
比如ruby中可以将一个类或对象的所有方法枚举出来,在obj-c中我们同样可以这样做:

#import <Foundation/Foundation.h>

int main(void){
    @autoreleasepool{
        unsigned int count = 0;
        Method *ms = class_copyMethodList([NSArray class],&count);
        for(int i=0;i<count;i++){
            char *ret_type = method_copyReturnType(ms[i]);
            const char *name = sel_getName(method_getName(ms[i]));
            NSLog(@"%d : %s(%d) : ret : %s",i,name,
                method_getNumberOfArguments(ms[i]),
                ret_type);

            free(ret_type);
        }
    }
    return 0;
}

obj-c中还有SEL和IMP的概念,真是和动态语言有的一拼鸟。
上面枚举的是类的实例方法,我们还可以枚举类方法:

NSLog(@"now query class methods :");
        ms = class_copyMethodList(object_getClass([NSArray class]),&count);
        for(int i=0;i<count;i++){
            char *ret_type = method_copyReturnType(ms[i]);
            const char *name = sel_getName(method_getName(ms[i]));
            NSLog(@"%d : %s(%d) : ret : %s",i,name,
                method_getNumberOfArguments(ms[i]),
                ret_type);
            free(ret_type);
        }

有人可能会问了:如果给类添加分类或协议的方法可以枚举出来吗?我还没试。不过很好验证,可以自己动手试一下。

时间: 2024-12-02 13:55:37

objective-c中类似ruby枚举类的实例方法的相关文章

objective c-C中int数组在类接口中的问题

问题描述 C中int数组在类接口中的问题 我希望能在类接口中定义一个作为实体变量的cInt数组,这样我就能通过任意方法访问它. @interface aVCofMine : UIViewController{ int[] myArray;} 还有 @interface aVCofMine : UIViewController{ int myArray[];} 但是完全没用,不知道是不是不能这样定义啊?要是能定义怎么定义? 谢谢. 解决方案 C数组需要动态分配和调整尺寸: @interface A

Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类

众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了何等神通让这些集合类型可以被自由的枚举??? 一: 探索IEnumerable 首先我们看看此接口都定义了些什么东西,如ILSpy所示: 从这个接口中,好像也仅仅有一个IEnumerator接口类型的方法之外,并没有可以挖掘的东西,这时候大家就应该好奇了,foreach既然可以枚举Collection

在Ruby中利用Net::SMTP类发送电子邮件的教程

  这篇文章主要介绍了在Ruby中利用Net::SMTP类发送电子邮件的教程,包括类中所带方法的用法介绍,需要的朋友可以参考下 简单邮件传输协议(SMTP)发送电子邮件及路由的e-mail邮件服务器之间的协议处理. Ruby 提供 Net::SMTP 类的简单邮件传输协议(SMTP)客户端的连接,并提供了两个新的方法:new 和 start. new 带两个参数: server name 默认为 localhost port number 默认为熟知的 25 start 方法带有以下这些参数:

源代码-JAVA枚举类定义中泛型的使用

问题描述 JAVA枚举类定义中泛型的使用 在枚举类的源代码中,有这样的定义:Enum > 在网上看了很多人的文章都没有看懂,请能够解释清楚的大神帮忙说说.E extends Enum到底有什么用? 为什么要这么写? 解决方案 E这个类继承了Enum,也就是E也是个枚举类型

sql server-mysql中datatable往数据库中大批量写入数据,类似sqlbulkcopy的类

问题描述 mysql中datatable往数据库中大批量写入数据,类似sqlbulkcopy的类 这个是sql server的写入数据库部分代码 不知道这样利用mysqldataadapter的update行不行 解决方案 多列数据的话,可以用sql语句.MySQL有一个executemany函数.一次插入多条数据.

Struts中巧用java枚举类生成select标签的下拉列表

    select下拉选项的value值我们通常会使用一些数字或者英文缩写便于存入数据库中,例如: <option value="1">男</option><option value="0">女</option>这样在数据库里存为1的记录代表是男,而0代表是女,在java类文件里,我们一般会定义为常量放在一个专门的类文件中:     public static String            SEX_MAN   

C# Idioms: Enum还是Enum Class(枚举类)

C# Idioms:Enum还是Enum Class(枚举类) marshine (原文排版格式:http://www.marshine.com) reversion:2004/5/28修改说明:感谢Ninputer提到的CLS兼容问题,同时修改了原来版本没有提及的Equals改写,以及修改"=="重载的不完善代码,和增加enum struct内容 reversion:2004/6/4 增加kirc提到的Enum的Flags特性,因为文本超长,新的版本可以在http://www.mar

js 数组实现一个类似ruby的迭代器_javascript技巧

<?XML:NAMESPACE PREFIX = O /> 分为如下几节: ·基本实现 ·在迭代中引用原来的对象,或者直接改变数组的值而不是返回一个新数组 ·向迭代传入无限多的参数 ·基本实现 今天突然发现js的数组处理起来真是麻烦,代码一些就是一大堆,相比起ruby的迭代器来真是逊色不少,主要是要写的代码太多了,也许是js有特殊的处理数组的方式,真是我不知道而已,但是我真的想自己给js实现一个类似ruby的迭代器的东东,而且实现起来也不难,那就开始动手吧. 真的应该庆幸js是动态语言啊,如果

Filter组件开发中的SDK基类分析

DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见combase.h)中继承而来的. [cpp] view plaincopy class CBaseObject   {      private:          // Disable the copy constructor and assignment by default so you will