我定义了一个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. [转]SpringMVC Controller&View数据传递

    Spring MVC3在controller和视图之间传递参数的方法:   一, 从controller往视图传递值, controller---->视图   1)简单类型,如int, Stri ...

  2. HTML5 is Canvas

    var cvs = document.getElementById("cvs"); // // 获取上下文环境 var con = cvs.getContext("2d& ...

  3. 【原创】C#搭建足球赛事资料库与预测平台(4) 比赛信息数据表设计

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...

  4. Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题

    在部署到iis的时候会出现这个状况. 解决:下载安装这个补丁 http://support.microsoft.com/kb/2468871 http://www.microsoft.com/zh-c ...

  5. DDD:一个朋友对领域驱动的小结

    首先我在一家老板有点关系的小软件公司带领一帮工作一两年的程序员做项目,这里要特别强调的是做项目(差不多是外包,只不过客户群体比较固定),项目就是今天项目A是这个逻辑,明天项目B是那个逻辑,两者之间的业 ...

  6. Unity 3D 一个简单的角色控制脚本

    之所以写这个脚本,是因为我想起了我还是新手的时候,那时为了一个角色控制脚本百度了半天还是一无所获,因为看不懂啊,都写的太高级了 希望这个脚本能够帮助那些 像曾经的我一样迷失于代码中的新手们能够清晰的理 ...

  7. Network - 对比net-tools与iproute2

    net-tools VS iproute2 net-tools与iproute2大比较

  8. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】

    最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...

  9. IOS学习笔记之 Socket 编程

    最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”.所以在今天,开始好好学习IOS.(本人之前4年都是搞.Net的,java也培训过一年) 打算学IOS,从哪入 ...

  10. Week1项目报告

    1. 预测时间 Personal Software Process Stages Time(h) 计划 · 估计这个任务需要多少时间 16.5 开发 · 需求分析 (包括学习新技术) 4 · 生成设计 ...