我定义了一个Person类作为测试。

其中Person.h:

//
// Person.h
// Test
//
// Created by zhanggui on 15/8/16.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import <Foundation/Foundation.h>
#import <UIKit/UITabBar.h>
@protocol PersonDelete <NSObject> - (void)protocolMethod1;
- (void)protocolMethod2; @end
@interface Person : NSObject<UITabBarDelegate> @property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)NSUInteger age;
@property (nonatomic,copy)NSString *address;
- (void)personRun;
- (void)eat;
- (void)goToSchool:(NSString *)vehicle; + (void)method1;
@end

Person.m:

//
// Person.m
// Test
//
// Created by zhanggui on 15/8/16.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import "Person.h" @implementation Person - (void)personRun {
NSLog(@"run method was called");
}
- (void)eat {
NSLog(@"eat method was called");
}
- (void)goToSchool:(NSString *)vehicle {
NSLog(@"Person go to school by %@",vehicle);
}
+ (void)method1 {
NSLog(@"类方法");
}
@end

然后集中在ViewController中的viewDieLoad方法中测试:(具体的讲解都在注释中了)

- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc] init];
unsigned int outCount = ;
Class cls = person.class; //得到Person的class
//--------------------类名
NSLog(@"类名是 :%s",class_getName(cls));
//-----------父类
NSLog(@"父类名是:%s",class_getName(class_getSuperclass(cls))); //是否是元类
if (class_isMetaClass(cls)) {
NSLog(@"Person是元类");
}else
{
NSLog(@"Person不是元类");
}
//返回指定类的元类
Class meta_class = objc_getMetaClass(class_getName(cls));
NSLog(@"%ss 的元类 是 %s",class_getName(cls),class_getName(meta_class)); //变量实例大小 %zu用来输出size_t类型的。
NSLog(@"实例大小::%zu",class_getInstanceSize(cls)); //成员变量 Iavr:一个不透明的类型代表实例变量。这里可以得到其所有的成员变量
Ivar *ivars = class_copyIvarList(cls, &outCount);
for (int i=;i<outCount;i++)
{
Ivar ivar = ivars[i];
NSLog(@"实例变量的名字:%s at index %d",ivar_getName(ivar),i);
}
free(ivars); //释放成员变量实例
//通过名字:获取指定的实例变量,,比如我想获取该类是否有_name这个变量就可以通过该方法获得。
Ivar string = class_getInstanceVariable(cls, "_name");
if (string!=NULL) {
NSLog(@"%s有实列变量:%s",class_getName(cls),ivar_getName(string));
}else
{
NSLog(@"%s没有指定的实列变量:%s",class_getName(cls),ivar_getName(string));
} //属性操作:objc_porperty:代表公开的属性.class_getProperty的参数中:cls代表该类的class,name是该类的属性
objc_property_t array = class_getProperty(cls, "name");
if (array!=NULL) {
NSLog(@"属性:%s",property_getName(array));
}
//方法操作:
Method *methods = class_copyMethodList(cls, &outCount);
for (int i=; i<outCount; i++) {
Method method = methods[i];
NSLog(@"方法签名是:%s",sel_getName(method_getName(method))); //sel_getName:得到方法名字
}
free(methods); //释放methods所占用的内存
// typedef struct objc_method *Method;
//这里得到的是类方法
// struct objc_method {
// SEL method_name OBJC2_UNAVAILABLE;
// char *method_types OBJC2_UNAVAILABLE;
// IMP method_imp OBJC2_UNAVAILABLE;
// }
//IMP Method classMethod = class_getClassMethod(cls, @selector(method1));
if (classMethod!=NULL) {
NSLog(@"%s 有该类方法:%s",class_getName(cls),sel_getName(method_getName(classMethod)));
}else
{
NSLog(@"%s 没有该类方法:%s",class_getName(cls),sel_getName(method_getName(classMethod)));
} //判断类的实例是否相应某个方法:比如alloc就不响应,而init就相应
if (class_respondsToSelector(cls, @selector(alloc))) {
NSLog(@"Person实例 响应 alloc");
}else
{
NSLog(@"Person实例 不响应 alloc");
}
//函数指针
IMP imp = class_getMethodImplementation(cls, @selector(eat));
imp();
//获得该类具有的协议
Protocol *__unsafe_unretained * protocols = class_copyProtocolList(cls, &outCount);
Protocol *protocol;
for (int i=; i<outCount; i++) {
protocol = protocols[i];
NSLog(@"协议名称:%s",protocol_getName(protocol));
}
//判断是否遵守协议
if (class_conformsToProtocol(cls, protocol)) {
NSLog(@"Person遵守协议%s",protocol_getName(protocol));
}else
{
NSLog(@"Person不遵守协议%s",protocol_getName(protocol));
} }

附:

参考与:http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/

认识Runtime2的更多相关文章

  1. 腾讯云(Linux)安装.net core sdk2.1、net core runtime2.1

    按照微软指令安装: sdk2.1:https://www.microsoft.com/net/download/linux-package-manager/centos/sdk-current 1. ...

  2. “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

    除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性" ...

  3. go runtime scheduler

     http://www.slideshare.net/matthewrdale/demystifying-the-go-scheduler http://www.cs.columbia.edu/~a ...

  4. .Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");

    今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪?网上大部分的教程都写着,可以使用Ass ...

  5. 尝鲜delphi开发android/ios_环境搭建

    Delphi这又老树发新枝了,开始做终端程序开发了,这个东西的准确名字是:RAD Studio XE5,可以使用delphi和c++ builder进行终端开发. 我尽可能讲啰嗦一些,免得回头被人问. ...

  6. .Net冷知识之动态查找类型时的程序集路径问题

    今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪? 网上大部分的教程都写着,可以使用As ...

  7. 使用 pprof 和 Flame-Graph 调试 Golang 应用

    前言 最近用 Golang 实现了一个日志搜集上报程序(内部称 logger 项目),线上灰度测试过程发现 logger 占用 CPU 非常高(80% - 100%).而此项目之前就在线上使用,用于消 ...

  8. Android:CheckBox控件

    1)ChexkBox继承自CompoundButton组件: 2)isChecked()--确定是否选中:setChecked(bool checked)--设置选中或取消选中: 3)监听事件:Com ...

  9. 理解channel 工作原理以及源码

    Go 的并发特性  goroutines: 独立执行每个任务,并可能并行执行 channels: 用于 goroutines 之间的通讯.同步 一个简单的事务处理的例子  对于下面这样的非并发的程序: ...

随机推荐

  1. 编译安装GCC 4.7.2

    from:http://blog.chinaunix.net/uid-20717979-id-3485672.html 安装gcc需要GMP.MPFR.MPC这三个库,可从ftp://gcc.gnu. ...

  2. http协议客户端向服务器端请求时一般需要发送的内容

    out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...

  3. php -- php读取sqlserver2005的数据实现分页查询

    --php5.2 --sqlserver2005 php读取sqlserver多条数据时,有时因为数据太多,需要进行分页查询. 例如,按价格的顺序,读取同一类型的产品的第30到第48条记录 $star ...

  4. 分享一套精美的现代 UI PSD 工具包【免费下载】

    艾库特·耶尔马兹,是土耳其伊斯坦布尔的一位高级艺术总监,他向大家分享了一套美丽的现代 UI 工具包,你可以免费下载.所以,你可以使用这个优秀的素材设计视觉互动和有吸引力的用户界面. 此 UI 套件提供 ...

  5. java高级---->Java动态代理的原理

    Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...

  6. 基于HTML5技术的电力3D监控应用(四)

    回答了知乎问题较长,一些使用WebGL的经验,作为新的一篇: 正好逛到这个问题,正好是2013年底,正好最近基于的HT for Web 3D做的电力项目收尾,正好用到的就是WebGL技术,因此说说自己 ...

  7. Java魔法堂:打包知识点之META-INF/MAINFEST.MF

    一.前言     通过执行形如 jar -cvf src.jar src 命令将多个.class文件打包成JAR包时,你会发现JAR包中除了src目录外还多了个MATE-INF/MAINFEST.MF ...

  8. .net core 1.0 Web MVC 自定义认证过程

    通过官方的介绍可知,若要本地开始部署搭建一个基于.net core 1.0的Web应用,需要下载dotnet SDK,或在Visual Studio IDE之上安装相关插件以布置开发环境.为了使开发环 ...

  9. 安装percona-xtrabackup一直提示依赖冲突的一个解决办法

    我的Mysql是5.6版本,通过自己下载的rpm包执行安装: yum instal percona-xtrabackup-2.1.7-721.rhel6.x86_64.rpm 会出现如下的安装错误提示 ...

  10. HBase Scan Timeout-OutOfOrderScannerNextException

    最近迁移数据时需要执行大Scan,HBase集群经常碰到以下日志: Exception in thread "main" org.apache.hadoop.hbase.DoNot ...